如何编写适配单多行场景的RegEx,提取指定位置的目标内容
问题原因
- 核心问题1:原正则没有限制三位编码和目标字符串之间的内容不能出现其他三位独立数字,开启单行模式后,正则会从全文第一个三位数字开始匹配,而非目标字符串向前最近的三位数字,第二组测试用例中就会错误匹配到靠前的
101,而非你需要的104。 - 核心问题2:原正则在三位数字捕获组后硬编码了一个空格,若三位数字后跟随制表符、换行等其他空白符就会匹配失败;同时结尾用
\n匹配换行,若目标行末尾没有换行符也会匹配失败。
修正后的正则(仍保留global、single line标志)
\b(\d{3})\b(?:(?!\b\d{3}\b).)*?Adónem számlaszáma: (\S+)
规则说明
\b(\d{3})\b:捕获作为独立单词存在的三位数字编码(?:(?!\b\d{3}\b).)*?:为调和贪婪量词结构,匹配任意字符的同时保证中间不会出现新的三位独立数字,天然确保捕获到的是离目标字符串最近的三位编码Adónem számlaszáma::匹配固定目标前缀(\S+):捕获后续连续的非空白字符作为账号,无需依赖行尾换行符,兼容性更强
匹配结果验证
对两组测试用例都可以得到预期结果:
- 第一组测试用例:捕获编码
101、中间文本Társasági adó、账号10032000-01076019 - 第二组测试用例:捕获编码
104、中间文本Általános forgalmi adó、账号10032000-01076868
内容的提问来源于stack exchange,提问作者Milán Forgách
相关产品推荐
相关产品推荐

