- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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 - 都得到相同的结果。哪个是首选,为什么?还是完全不同的方法更好?
最佳答案
您在 regex 中从两位受过良好教育的积极人士那里获得了两条有效评论但我将提供一些补充。一个贪婪的标记 .*
大部分时间会导致回溯步骤,它吞下所有东西直到结束(或者实际上直到第一个换行符)然后向后退。 .*
的真实定义不应该是零个或多个,而是全部、部分或全部。
因此,如果 abc
发生在输入字符串 .*
的末尾附近,则比非贪婪量词 .*?
更早满足引擎,否则引擎回溯直到它有机会匹配 abc
或在最坏的情况下什么都不匹配。
话虽如此,回溯步数等于输入字符串的长度。相反,如果已知 abc
发生在输入字符串的开头附近,特别是在大数据上,.*?
会比 .*
导致更早的匹配>。
此外,由于其前瞻性行为,它不会在同一路径上进行回溯。
您有时会发现语言方法 - 除了坚持使用正则表达式 - 更快、更有用,例如 lastIndexOf()
在 JS 中。
关于javascript - 使用负前瞻正则表达式 abc(?!.*abc) 与 abc(?!.*?abc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49372598/
我有一个看起来像这样的字符串: text = "9) 9 的文本\r\n10) 10 的文本\r\n11) 11 的文本\r\n12) ...\r\n123) 123 的文本" 我正在尝试将其拆分如下
下一代的 3D Tiles 前瞻 原文:Introducing 3D Tiles Next, Streaming Geospatial to the Metaverse 原文发布时间:2021年11月
我有一个使用正则表达式回顾的 string.replace() 函数。 myString.replace(/(?
我是一名优秀的程序员,十分优秀!