如何用正则匹配前面没有出现特定词.get的字符串ARIBABA
正则需求实现方案
原正则错误原因
你编写的^(.get)\bARIBABA\b存在3个核心问题:
- 逻辑完全相反:开头的
^(.get)强制要求行首必须紧跟匹配.get(且未转义点号,这里的.会匹配任意字符),和你需要排除.get的需求完全相悖 - 未考虑字符间隔:没有处理
.get和ARIBABA之间可能存在的任意长度其他字符 - 元字符未转义:
.在正则中是匹配任意非换行字符的通配符,要匹配字面量的英文句号,必须转义为\.
正确正则写法
写法1:支持可变长度负向回顾的引擎(Python 3.7+、Java 8+、JS ES2018+等)
直接使用负向回顾断言实现需求,匹配所有**前面没有出现过.get**的独立ARIBABA单词:
\b(?<!\.get.*)ARIBABA\b
语法说明:
\b:单词边界,避免匹配到包含ARIBABA的更长字符串(比如XARIBABA),不需要可以去掉(?<!\.get.*):负向零宽回顾断言,判断当前位置(即ARIBABA的开头位置)之前,是否出现过.get加任意字符的组合,仅当不存在时才继续匹配ARIBABA:匹配目标字符串
写法2:兼容低版本正则引擎
如果你的运行环境不支持可变长度负向回顾,可以用负向前瞻+捕获组的写法,取第一个捕获组的内容即可:
^(?:(?!\.get).)*\b(ARIBABA)\b
语法说明:
^(?:(?!\.get).)*:从行首开始匹配所有不包含.get的字符,?:表示非捕获组,不占用分组序号\b(ARIBABA)\b:匹配独立的ARIBABA并放入第一个捕获组
匹配验证
- 符合匹配的场景示例:
ARIBABA = config.test('SOMETHING', 'ARIBABA').lower(),会匹配到两个ARIBABA - 部分匹配的场景示例:
ARIBABA = config.get('SOMETHING', 'ARIBABA').lower(),仅会匹配到=左侧的ARIBABA,右侧get参数内的ARIBABA因为前面出现了.get会被排除
内容的提问来源于stack exchange,提问作者Kamikaz Ali
相关产品推荐
相关产品推荐

