如何编写正则表达式匹配指定偏移位置的字符串且排除此前已出现的该字符串?
如何编写正则表达式匹配指定偏移位置的字符串且排除此前已出现的该字符串?
这个问题我太懂了!你需要的是精准匹配指定偏移位置的目标字符串,同时确保从起始点到这个偏移位置的范围内完全没出现过目标字符串,对吧?
先说说你原来正则的问题:(?<=PLUS.{29})SC只完成了「定位到PLUS后第29位的位置」这一步,但完全没限制中间的29个字符里能不能有SC——所以第二个测试字符串里,哪怕前面已经出现过SC,只要第29位后面还有SC,它照样会匹配,这就不符合你的需求了。
解决方案正则
直接用这个正则就能实现你的要求:
(?<=PLUS(?:(?!SC).){29})SC
逐部分解释一下为什么这么写:
PLUS:先定位到起始标记,确保我们从正确的位置开始计数。(?:(?!SC).){29}:这是关键的限制逻辑——(?!SC)是负向预查,意思是「当前位置后面不能是SC」;.匹配任意单个字符;- 把这俩放一起用非捕获组
(?:...)包裹,再重复29次,就表示「连续匹配29个字符,每一个字符的位置都不能是SC的开头」,从根源上保证了从PLUS到目标位置的这段文本里绝对没有SC出现。
- 最后
(?<=...)是正向预查,确保当前位置正好在符合要求的29位之后,然后匹配后面的SC。
测试效果验证
- 对于第一个字符串
PLUS This is a AC and this is an SC too:
从PLUS开始的29个字符里没有SC,预查条件满足,所以会成功匹配后面的SC。 - 对于第二个字符串
PLUS This is a SC and this is an SC too:
数到第29位之前就已经出现了SC,(?:(?!SC).){29}无法完整匹配29个符合要求的字符,预查不成立,所以不会匹配后面的SC,完美符合你的需求!
备注:内容来源于stack exchange,提问作者Milind
相关产品推荐
相关产品推荐

