正则表达式负向前瞻匹配问题:如何仅匹配指定getObject语句
正则匹配问题解决方案
你的测试字符串:
getObject('modSnippet') getObject($prefix . 'modSnippet' getObject($classPrefix . 'modSnippet'
你想只匹配第一行,排除后两行,但之前的两个正则都失效了,问题出在否定前瞻的位置和匹配逻辑不对:
- 第一个正则
(?!prefix|Prefix)getObject:前置前瞻是检查getObject前面有没有prefix或Prefix,但三行的getObject前面都没有这些内容,所以全部匹配。 - 第二个正则
getObject(?!prefix|Prefix):后置前瞻是检查getObject后面紧跟的字符是不是prefix或Prefix,但三行里getObject后面紧跟的是(或($,根本不是prefix开头的字符串,所以也会全部匹配。
正确的正则写法
要精准匹配第一行,你可以用两种思路:
思路1:匹配getObject后直接跟单引号包裹内容的情况
getObject\('modSnippet'\)
这个正则完全匹配第一行的完整语句,直接排除后两行(因为它们后面是$prefix相关内容)。如果需要更通用,匹配getObject后紧跟('的情况:
getObject\('
思路2:用否定前瞻排除后面带有$prefix或$classPrefix的情况
需要把否定前瞻的范围扩大,检查getObject之后是否出现\$prefix或\$classPrefix(注意$是正则特殊字符,需要转义成\$):
getObject(?!.*\$(class)?prefix)
解释:
(?!.*\$(class)?prefix):否定前瞻,匹配getObject后面不存在任意字符(.*)+$+可选的class+prefix的情况,这样就会排除后两行。
如果要匹配整行,可以加上行首行尾锚定:
^getObject(?!.*\$(class)?prefix).*$
内容的提问来源于stack exchange,提问作者Bob Ray
相关产品推荐
相关产品推荐

