【问题标题】:regular expressions difference between ((?:[^\"])*) and ([^\"]*)((?:[^\"])*) 和 ([^\"]*) 之间的正则表达式区别
【发布时间】:2013-09-18 04:38:02
【问题描述】:

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

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


([^\"]*)

这个问题的背景:

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:

【问题讨论】:

  • 不错的观察。也许是 Firefox/Gecko 错误?
  • @Cybȫʁgϟ37:这对 OP 毫无帮助,因为 TinyMCE 的代码不应归咎于他(我想)
  • @NiklasB。 - 啊,我现在明白了。
  • 应该没有区别。你有什么经验吗?

标签: javascript regex


【解决方案1】:

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

但是,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 bugnice test case 比较某人放在一起的不同表达类型。

【讨论】:

    猜你喜欢
    • 2012-06-01
    • 2016-11-18
    • 2012-02-22
    • 2023-04-07
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多