((?:[^ \“])*)和([^ \”] *)之间的正则表达式差异

时间:2013-09-13 13:11:52

标签: javascript regex

这个正则表达式之间的区别是可替换的吗?

((?:[^\"])*)


([^\"]*)

这个问题的背景:

javascript WYSIWYG编辑器(tinymce)无法解析我的html代码 在Firefox(23.0.1和25.0a2)中,但在Chrome中工作。

我发现正则表达式应该受到指责:

attrRegExp = /([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g;

我修改了,替换

((?:[^\"])*) 

([^\"]*)

((?:[^\'])*) 

([^\']*)

生成的正则表达式适用于我的测试用例的两个浏览器

attrRegExp = /([\w:\-]+)(?:\s*=\s*(?:(?:\"([^\"]*)\")|(?:\'([^\']*)\')|([^>\s]+)))?/g

有人可以对此有所了解吗?

我的测试数据仅适用于修改后的正则表达式,是一个大图像> 700 kb,如:

var testdata = '<img alt="" src="data:image/jpeg;base64,/9j/4AAQSkZJRgA...5PmDk4FOGOHy6S3JW120W1uCJ5M0PBa54edOFAc8ePX/2Q==">'

做类似的测试:

testdata.match(attrRegExp);

特别是当测试数据很大时,未经修改的正则表达式很可能在firefox中失败。

您可以找到jsfiddle example here

1 个答案:

答案 0 :(得分:5)

结果应该没有区别。所以你应该没事。

然而,RegExp引擎如何处理这两个表达式可能会有很大的不同,而在Firefox / Safari的情况下,你只是证明了实际存在;)

Firefox使用WebKit / JavaScriptCore YARR。 YARR强加了一个任意的artificial limit,它在非捕获组变体中命中

// The below limit restricts the number of "recursive" match calls in order to
// avoid spending exponential time on complex regular expressions.
static const unsigned matchLimit = 1000000;

因此,Safari也会受到影响。

查看相关的Webkit bug和相关的Firefox bug以及nice test case,比较某人放在一起的不同表达类型。