首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用负前瞻性regex abc(?!.*abc)与abc(?!.*?abc)

使用负前瞻性regex abc(?!.*abc)与abc(?!.*?abc)
EN

Stack Overflow用户
提问于 2018-03-19 21:26:22
回答 1查看 109关注 0票数 1

我使用JavaScript中的regex负前瞻来使用regex匹配来替换字符串中的最后一个字符串。

下面是我的代码片段:

代码语言:javascript
复制
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 --都得到了相同的结果。哪个是首选,为什么?还是完全不同的方法更好?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-19 22:19:52

您在regex中得到了两位受过良好教育的活跃人士的有效评论,但我将提供一些补充。贪婪的令牌.*在大多数情况下都会导致回溯步骤,它会吞噬每一件东西,直到结束(或者实际上直到第一个换行符),然后向后退一步。.*的真正定义不应该是零或更多,而应该是所有的东西或什么都不是。

因此,如果abc发生在输入字符串的末尾附近,那么.*满足引擎的时间早于非贪婪的量词.*?,否则引擎会返回,直到它有机会匹配abc,或者在最坏的情况下没有匹配。

尽管如此,回溯步骤的数目等于输入字符串的长度。相反,如果已知abc发生在输入字符串的开头附近,特别是在大型数据上,则.*?会导致比.*更早的匹配。

此外,由于其前瞻性行为,它不会在同一条路径上回溯。

有时,您可能会发现语言方法--除了坚持使用正则表达式--更快、更有帮助,比如JS中的lastIndexOf()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49372598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档