如何仅用regex匹配CNPJ且排除含INTERESSADO子串的匹配项
你原正则的问题在于负向前瞻的校验范围错误:你写的(?!interessado: )仅校验了表达式起始位置的后续字符是否直接匹配interessado: ,没有检查整个匹配段中是否存在INTERESSADO子串,所以即使行内包含INTERESSADO,只要不是紧跟在起始位置后面,都会被正则匹配到。
修正后的正则如下:
^(?!.*INTERESSADO).*?CNPJ\W+(?P<cnpj>\d+\.\d+\.\d+\s?\/\d+\s?-\s?\d+)
正则各部分作用说明:
^匹配行首,确保从每一行的起始位置开始校验,如果你的文本是多行格式,建议额外开启多行匹配(m)标志,让^可以准确匹配每一行的行首,避免跨行匹配的问题(?!.*INTERESSADO)负向前瞻,校验当前行从开头到后续所有位置中,不存在INTERESSADO子串,存在就直接终止匹配.*?非贪婪匹配行内CNPJ之前的任意字符CNPJ\W+匹配CNPJ标识以及其后的非单词分隔符(?P<cnpj>\d+\.\d+\.\d+\s?\/\d+\s?-\s?\d+)命名分组捕获符合格式的CNPJ,兼容分隔符前后的空格
在你已开启不区分大小写(i)和点号匹配换行(s)的标志下,该正则会自动过滤所有包含INTERESSADO的行,仅捕获RECLAMADO对应的CNPJ,完全符合你不使用if条件、仅靠正则实现过滤的要求。
内容的提问来源于stack exchange,提问作者Daniel Bailo
相关产品推荐
相关产品推荐

