使用positive lookbehind匹配数字后至换行前全部字符的正则问题
正则匹配方案
原有正则失效原因
你原来的正则在后行断言末尾使用了带空格的.* 贪婪匹配逻辑,会一直匹配到地址行的最后一个空格后才停止。当路名本身包含多个空格时,匹配位置就会偏离数字前的位置,导致匹配失效。
符合要求的正则方案
方案1:使用正向后行断言(需引擎支持可变长度后行断言)
适用引擎:Python 3.10+、.NET、Java 9+、PHP 7.3+等支持可变长度正向后行断言的环境
匹配数字+可选后缀字母及后续内容(和你原有生效场景的匹配结果一致)
正则表达式:(?<=below customer\.\n.*\n.*?)\d+[a-zA-Z]?.*$
匹配逻辑说明:
(?<=below customer\.\n.*\n.*?):正向后行断言锚定基准,先匹配固定的below customer.行尾,跳过中间的用户名行到地址行开头,惰性匹配所有非数字内容直到数字前的位置\d+:匹配1个及以上的数字[a-zA-Z]?:匹配数字后可能存在的单个字母后缀.*$:匹配数字之后到当前行换行前的所有内容
测试效果:
对于路名带空格的场景,例如下方文本:
I order standardinstalation to below customer. Paul Rilley High Tory road 55b
可以正确匹配到结果55b。
仅匹配数字之后的内容(不含数字本身)
如果你的需求是只提取数字(含可选后缀字母)之后到行尾的内容,将数字部分移入后行断言即可:(?<=below customer\.\n.*\n.*?\d+[a-zA-Z]?).*$
方案2:捕获组方案(全引擎兼容)
如果你的正则引擎不支持可变长度后行断言,可以改用捕获组实现,兼容性更强:
正则表达式:below customer\.\n.*\n.*?(\d+[a-zA-Z]?.*)$
使用时直接取第一个捕获组的内容即可得到目标结果。
内容的提问来源于stack exchange,提问作者HenkkaHH
相关产品推荐
相关产品推荐

