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

时间:2015-08-11 21:36:00

标签: javascript regex

Demo here。正则表达式:

([^>]+)$

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

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

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

编辑:这里有snippet用于测试各种正则表达式(单击"运行"在控制台区域中)。
编辑2:no-match test

2 个答案:

答案 0 :(得分:3)

考虑像这样的输入

abc<def>xyz

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

.+>([^>]+)$

无论前面有多少输入,回溯都会受到最后一段的长度的限制。

第二个表达式不等同于第一个表达式,但由于您使用的是分组,因此只需选择matches[1]即可。

提示:即使你定位javascript,也可以切换到pcre模式,这样你就可以访问步骤信息和调试器了:

enter image description here

(看看绿色的酒吧!)

答案 1 :(得分:1)

您可以使用实际的DOM而不是Regex,这很耗时:

var html = "<div><span>blabla</span></div><div>bla</div>Here I am !";

var temp = document.createElement('div');
temp.innerHTML = html;
var lastNode = temp.lastChild || false;

if(lastNode.nodeType == 3){
    alert(lastNode.nodeValue);
}