RegExp#test中是否存在使用捕获组的性能损失?

时间:2015-10-25 05:09:35

标签: javascript regex node.js

免责声明:我的问题不是专注于练习,它只是一个例子(尽管如果你对这个例子本身有任何有趣的提示,请随时分享!)。

假设我正在使用JavaScript中的Regex解析一些字符串,我主要关注的是性能(速度)。

我有一个正则表达式检查数字字符串,然后使用Number解析它,如果它是数字:

if (/^\[[0-9]+]$/.test(str)) {
  val = Number(str.match(/^\[([0-9]+)$/)[1]);
}

请注意条件测试如何在数字周围没有捕获组。这导致基本上写出两次相同的正则表达式,除了第二次使用捕获组。

我想知道的是这个;是否在某个条件下向test()旁边的正则表达式添加捕获组会以任何方式影响性能?我想在这两个地方使用捕获正则表达式,只要没有性能损失。

关于我为什么要test()然后match()而不是match()并检查null的问题;我希望在错过的时候尽可能快地解析,但是当遇到命中时可以稍慢一些。

如果从上面不清楚,我指的是JavaScript的正则表达式引擎 - 虽然如果这在引擎上有所不同,那么也很高兴知道。我在这里专门研究Node.js,如果JS引擎也不同。

提前致谢!

1 个答案:

答案 0 :(得分:1)

做2个正则表达式 - 在范围上非常相似 - 几乎总是比单个正则表达式慢,因为正则表达式是贪婪的(这意味着它们将尝试尽可能多地匹配,通常意味着占用最大量的时间可能)。

你所要问的基本上是:在最坏的情况下(也就是使用.test从捕获中节省内存)更少的内存是否比使用额外的内存更快?答案是否定的,使用额外的内存可以加快您的流程。

不要相信我的话,这里有一个jsperf:http://jsperf.com/regex-perf-numbers