如何让正则表达式匹配结果包含模式中的首字符?
正则匹配修正方案
问题场景
待匹配文本:
This is a test ::a. MODE 3 within 7 hours,
::b. MODE 4 within 13 hours, and
::c. MODE 5 within 37 hours
:: My Test
原正则表达式:(?<=^::[A-z ])(.*?)(?=$)
该正则能正确定位目标行,但匹配结果会缺失首字符——比如匹配::b. MODE...行时,结果为. MODE 4 within 13 hours, and,需要改为包含首字符的b. MODE 4 within 13 hours, and。
修正方案
方案1:缩小正向预查的匹配范围
将正则修改为:
(?<=^::)(.*?)(?=$)
原正则的预查部分(?<=^::[A-z ])把首字符(比如b)包含在了预查范围内,而预查内容不会被捕获,导致首字符丢失。修改后预查仅匹配行首的::,后续所有内容(包括首字符)都会被(.*?)捕获。
方案2:改用分组捕获(更简洁直观)
直接使用正则:
^::(.*?)$
这个写法直接匹配行首的::,然后通过捕获组(.*?)获取::之后的所有内容,同样能得到包含首字符的完整结果,且语法更简单易懂。
内容的提问来源于stack exchange,提问作者CodeLikeBeaker
相关产品推荐
相关产品推荐

