2012-04-15 105 views
0

这个正则表达式有什么区别:/(everything|cool)/gi和这个:/(?:everything|cool)/gi正则表达式:性能

我问这个,因为我有一个正则表达式,我无法给自己写 *这和有,因为你可以看到下面,很多?:在正则表达式。我读过?:对性能不利的地方,所以我想删除它。我可以删除它,还是对任何事情都很重要?

* (?:(?=(?:(?:\\.|"(?:\\.|[^"\\])*"|[^\\'"])*'(?:\\.|"(?:\\.|[^"'\\])*"|[^\\'])*')*(?:\\.|"(?:\\.|[^"\\])*"|[^\\'])*$)(?=(?:(?:\\.|'(?:\\.|[^'\\])*'|[^\\'"])*"(?:\\.|'(?:\\.|[^'"\\])*'|[^\\"])*")*(?:\\.|'(?:\\.|[^'\\])*'|[^\\"])*$)(?:\\.|[^\\'"]))+

回答

4

没有?:,创建了对匹配组的引用。
使用?:,该组匹配,但未捕获。

这里有两种方法的基准:http://jsperf.com/regex-capture-vs-non-capture

通过观察吧,一会说,非捕获组更快。但是,如果你看看底部,可以忽略不同,因为这两种方法已经非常快。

删除或添加?:到现有的解决方案可能会破坏代码,所以我建议不要在没有引起任何问题时编辑RegExp。

4

(?:...)是罚款。这是当捕获群体,特别是对它们的反向引用,让你开始看到性能命中。

+0

非捕获组更快速的关键在于它们允许RE引擎进行大量优化。捕获组需要更多的信息由匹配器保存,并且会导致很多更复杂的优化(例如转换为单通DFA)。 – 2012-04-15 17:49:20

+0

奇怪的是,我发现一个非捕获组的性能比甚至没有组都要好。 :P http://jsperf.com/regex-capture-vs-non-capture/2(可能v8具体) – cHao 2012-04-15 17:51:16

+0

这是一个非常好奇的结果。我想知道是否有任何问题垃圾收集踢? (我怀疑那是当我在该页面上运行测试时发生的事情......) – 2012-04-15 18:05:26

2

您应该听说(foo)(?:foo)慢。这是因为第一个是捕获组,第二个是未捕获组。第二个有更少的工作要做(它不需要记住匹配的文本),所以它应该更快。