这个正则表达式之间的区别是可替换的吗?
((?:[^\"])*)
([^\"]*)
Run Code Online (Sandbox Code Playgroud)
这个问题的背景:
javascript WYSIWYG编辑器(tinymce)无法在Firefox(23.0.1和25.0a2)中解析我的html代码,但在Chrome中工作.
我发现正则表达式应该归咎于:
attrRegExp = /([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g;
Run Code Online (Sandbox Code Playgroud)
我修改了,替换
((?:[^\"])*)
Run Code Online (Sandbox Code Playgroud)
同
([^\"]*)
Run Code Online (Sandbox Code Playgroud)
和
((?:[^\'])*)
Run Code Online (Sandbox Code Playgroud)
同
([^\']*)
Run Code Online (Sandbox Code Playgroud)
生成的正则表达式在我的测试用例的两个浏览器中都有效
attrRegExp = /([\w:\-]+)(?:\s*=\s*(?:(?:\"([^\"]*)\")|(?:\'([^\']*)\')|([^>\s]+)))?/g
Run Code Online (Sandbox Code Playgroud)
谁可以对此有所了解?
我的测试数据仅适用于修改过的正则表达式,是一个大图像> 700 kb,如:
var testdata = '<img alt="" src="data:image/jpeg;base64,/9j/4AAQSkZJRgA...5PmDk4FOGOHy6S3JW120W1uCJ5M0PBa54edOFAc8ePX/2Q==">'
Run Code Online (Sandbox Code Playgroud)
做类似的测试:
testdata.match(attrRegExp);
Run Code Online (Sandbox Code Playgroud)
特别是当测试数据很大时,未经修改的正则表达式很可能在firefox中失败.
你可以在这里找到jsfiddle示例:
结果应该没有区别.所以你应该没事.
但是,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;
Run Code Online (Sandbox Code Playgroud)
因此,Safari也会受到影响.
查看相关的Webkit错误和相关的Firefox错误以及比较有人放在一起的不同表达类型的漂亮测试用例.