我使用JavaScript中的regex负前瞻来使用regex匹配来替换字符串中的最后一个字符串。
下面是我的代码片段:
var str = 'abc abc abc'
var regex1 = /abc(?!.*?abc)/
var regex2 = /abc(?!.*abc)/
var ematch1 = regex1.exec(str);
var ematch2 = regex2.exec(str);
console.log(ematch1, ematch1.index);
console.log(ematch2, ematch2.index);
这两个正则表达式-- regex1和regex2 --都得到了相同的结果。哪个是首选,为什么?还是完全不同的方法更好?
发布于 2018-03-19 22:19:52
您在regex中得到了两位受过良好教育的活跃人士的有效评论,但我将提供一些补充。贪婪的令牌.*在大多数情况下都会导致回溯步骤,它会吞噬每一件东西,直到结束(或者实际上直到第一个换行符),然后向后退一步。.*的真正定义不应该是零或更多,而应该是所有的东西或什么都不是。
因此,如果abc发生在输入字符串的末尾附近,那么.*满足引擎的时间早于非贪婪的量词.*?,否则引擎会返回,直到它有机会匹配abc,或者在最坏的情况下没有匹配。
尽管如此,回溯步骤的数目等于输入字符串的长度。相反,如果已知abc发生在输入字符串的开头附近,特别是在大型数据上,则.*?会导致比.*更早的匹配。
此外,由于其前瞻性行为,它不会在同一条路径上回溯。
有时,您可能会发现语言方法--除了坚持使用正则表达式--更快、更有帮助,比如JS中的lastIndexOf()。
https://stackoverflow.com/questions/49372598
复制相似问题