6

这个正则表达式是可替换的有什么区别?

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


([^\"]*)

这个问题的背景:

javascript WYSIWYG 编辑器(tinymce)无法在 Firefox(23.0.1 和 25.0a2)中解析我的 html 代码,但可以在 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 示例

4

1 回答 1

5

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

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

Firefox 使用 WebKit/JavaScriptCore YARR。YARR 强加了一个任意的、人为的限制,该限制在非捕获组变体中命中

// 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 错误和相关的Firefox 错误以及比较某人放在一起的不同表达式类型的好测试用例。

于 2013-09-15T13:43:19.850 回答