0

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

我问这个是因为我有一个我自己无法编写的正则表达式* 并且正如您在下面看到的那样,?:该正则表达式中有很多内容。我读过某处?:对性能不好的地方,所以我想删除它。我可以删除它还是它对任何事情都很重要?

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

4

3 回答 3

4

(?:...)很好。当捕获组,尤其是对它们的反向引用时,您会开始看到性能下降。

于 2012-04-15T17:39:18.333 回答
4

如果没有?:,则会创建对匹配组的引用。
使用 a ?:,该组被匹配,但未被捕获。

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

通过查看条形图,可以说未捕获的组更快。但是,如果您查看底部,则可以忽略差异,因为这两种方法都已经非常快了。

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

于 2012-04-15T17:39:22.660 回答
2

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

于 2012-04-15T17:41:10.083 回答