如何仅匹配正则表达式的最后一个匹配实例?
问题分析与解决
原正则的问题
foo?写法错误:?表示前面的o可选,导致正则会匹配fo开头的内容,而你实际要匹配的是完整的foo开头,这个多余的?会扩大匹配范围。- 非贪婪匹配+全局标志导致全匹配:
.+?是非贪婪模式,会从第一个符合的foo开始,找到最近的bar就停止匹配;再加上g全局标志,正则就会遍历整个字符串,把所有符合foo(?)...bar的片段都找出来,自然会命中<em>里的两个实例,而非你要的最后一个。
匹配最后一个实例的解决方案
要精准匹配最后一个foo word bar,可以用两种思路:
思路1:贪婪匹配跳过前置内容
利用贪婪匹配的特性,让正则先“吃掉”前面所有内容,直到最后一个foo出现后再匹配到bar:
/.+(foo\s+word\s+bar)/
这里的捕获组$1就是你要的最后一个目标片段;如果不需要捕获组,且目标片段刚好在字符串末尾,也可以写为:
/foo\s+word\s+bar$/
思路2:负向预查确保是最后一个
用负向预查(?!.*foo\s+word\s+bar),确保匹配到的foo word bar后面不再有相同的模式,这样就能定位到最后一个:
/foo\s+word\s+bar(?!.*foo\s+word\s+bar)/
如果需要忽略大小写,可以加上i标志,否则去掉即可。
内容的提问来源于stack exchange,提问作者garson
相关产品推荐
相关产品推荐

