javascript - 字符串结尾正则表达式匹配太慢

标签 javascript regex

Demo here .正则表达式:

([^>]+)$

我想匹配未包含在标记中的 HTML 片段末尾的文本(即尾随文本节点)。上面的正则表达式似乎是最简单的匹配,但执行时间似乎与匹配文本的长度成线性比例(并且在我的浏览器扩展中使用时会导致挂起)。对于匹配和不匹配的文本,它的速度也同样慢。

为什么这个看似简单的正则表达式如此糟糕?

(我也尝试过 RegexBuddy,但似乎无法从中得到解释。)

编辑:这是一个snippet用于测试各种正则表达式(单击控制台区域中的“运行”)。
编辑 2:还有一个 no-match test .

最佳答案

考虑这样的输入

abc<def>xyz

使用您的原始表达式,([^>]+)$,引擎从a 开始,在> 上失败,回溯,从 b 重新开始,然后从 c 等重新开始。所以是的,时间随着输入的大小而增长。但是,如果您强制引擎首先使用最右边的 > 之前的所有内容,如:

.+>([^>]+)$

回溯将受到最后一段的长度的限制,无论它之前有多少输入。

第二个表达式不等同于第一个表达式,但由于您使用的是分组,所以它并不重要,只需选择 matches[1]

提示:即使您以 javascript 为目标,也请切换到 pcre 模式,这样您就可以访问步骤信息和调试器:

enter image description here

(看看绿色条!)

关于javascript - 字符串结尾正则表达式匹配太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31952381/

相关文章:

.net - 正则表达式 - 只匹配 7 个字符?

javascript - 我可以从父页面修改 iframe 中的元素吗?

java - 如何在 Android 中替换 JSON 字符串中的 HTML 转义字符

javascript - 更改 WP 插件中的 JS 函数

javascript - 谷歌使用javascript在一个循环中对多个地址进行地理编码,我怎么知道什么时候完成了?

javascript - 正则表达式:如何处理括号和反斜杠?示例:将“[{\变为[{

ASP.NET 密码强度正则表达式

java - 如何用后处理值替换正则表达式组?

javascript - 如何使用 jQuery 动态选择值

javascript - 在 react-native (expo) 上禁用原生抖动效果