gpt4 book ai didi

javascript - 使用负前瞻正则表达式 abc(?!.*abc) 与 abc(?!.*?abc)

转载 作者:行者123 更新时间:2023-11-30 14:43:00 28 4
gpt4 key购买 nike

我在 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 - 都得到相同的结果。哪个是首选,为什么?还是完全不同的方法更好?

最佳答案

您在 中从两位受过良好教育的积极人士那里获得了两条有效评论但我将提供一些补充。一个贪婪的标记 .* 大部分时间会导致回溯步骤,它吞下所有东西直到结束(或者实际上直到第一个换行符)然后向后退。 .* 的真实定义不应该是零个或多个,而是全部、部分或全部

因此,如果 abc 发生在输入字符串 .* 的末尾附近,则比非贪婪量词 .*? 更早满足引擎,否则引擎回溯直到它有机会匹配 abc 或在最坏的情况下什么都不匹配。

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

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

您有时会发现语言方法 - 除了坚持使用正则表达式 - 更快、更有用,例如 lastIndexOf()在 JS 中。

关于javascript - 使用负前瞻正则表达式 abc(?!.*abc) 与 abc(?!.*?abc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49372598/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com