正则表达式中((?:[^\"])*)和([^\"]*)的区别

6
这两个正则表达式有何不同?它们是否可以互换使用?
((?:[^\"])*)


([^\"]*)

这个问题的背景:

JavaScript所使用的所见即所得编辑器(tinymce)无法在Firefox(23.0.1和25.0a2版本)中解析我的HTML代码,但在Chrome中可以。

我发现这是由于正则表达式导致的:

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

我已经修改过的代码,将其替换为
((?:[^\"])*) 

使用

([^\"]*)

and

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

使用

([^\']*)

我的测试用例中,生成的正则表达式在两个浏览器中都能正常工作。

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

能有人解释一下吗?

我的测试数据是一个大于700kb的图片,只有使用修改后的正则表达式才能正常工作:

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

做这样的测试:

testdata.match(attrRegExp);

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

您可以在这里找到jsfiddle示例


不错的观察。也许是Firefox/Gecko的一个bug? - Niklas B.
2
应该没有任何区别。你有遇到什么问题吗? - zerkms
顺便提一下,在正则表达式中,您不需要转义引号。当使用"而不是\"(以及'而不是\')时,您是否看到任何区别? - Tim Pietzcker
可能是重复问题:https://dev59.com/-mw15IYBdhLWcg3wv-Xa - Sumurai8
2
https://bugzilla.mozilla.org/show_bug.cgi?id=838588 - nmaier
显示剩余4条评论
1个回答

5

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

然而,正则表达式引擎处理这两个表达式的方式可能会有很大的不同,在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漏洞以及一个不错的测试案例,比较了不同表达式类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接