如何使用positive lookbehind(正向后行断言)匹配NYC后指定三位数字
问题原因
- 你写的第一个正则
(?<=NYC)(\D|\S)*\d{3,}会将NYC之后到目标三位数字前的所有内容都纳入匹配结果,所以会输出大量无关内容。 - 第二个正则
(?<=NYC)(?<=(\D|\S)*)\d{3,}无法匹配的原因是,绝大多数正则引擎的正向后行断言要求匹配长度固定,你在后行断言里写的(\D|\S)*是可变长度规则,直接触发匹配失败。
解决方法
场景1:你使用的正则引擎支持可变长度后行断言(Python 3.10+、JS ES2018+、.NET等)
直接使用以下正则,匹配结果直接就是目标三位数字:
# 匹配NYC之后最后一个三位数字(和你预期的700匹配结果一致) (?<=NYC[\s\S]*)\d{3}(?!\d)
如果需要匹配NYC之后所有符合要求的三位数字,将贪婪匹配改为非贪婪即可:
(?<=NYC[\s\S]*?)\d{3}(?!\d)
场景2:你使用的正则引擎不支持可变长度后行断言(低版本Python、Java等)
用捕获组实现,正则如下:
# 匹配后取第一个捕获组的内容即可得到目标700 NYC[\s\S]*(\d{3})(?!\d)
如果要匹配NYC之后所有三位数字,改为非贪婪匹配后做全局匹配,每次取第一个捕获组内容即可:
NYC[\s\S]*?(\d{3})(?!\d)
内容的提问来源于stack exchange,提问作者Capitán Planeta
相关产品推荐
相关产品推荐

