在RegExp#test中使用捕获组会有性能损失吗?

免责声明:我的问题没有集中在练习上,只是一个例子(如果你对这个例子有任何有趣的提示,请随时分享!)。

假设我正在用JavaScriptparsing一些正则expression式的string,我的主要焦点是性能(速度)。

我有一个正则expression式检查一个数字string,然后使用Numberparsing它,如果它是数字的:

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

注意条件testing如何在数字周围没有捕获组。 这导致写出基本相同的正则expression式两次,除了捕获组第二次。

我想知道的是这个; 是否将一个捕获组添加到与test()一起使用的正则expression式中,条件会以任何方式影响性能? 我只想简单地在这两个地方使用捕获正则expression式,只要没有性能问题。

对于为什么我要做test()然后match()而不是match()并检查null , 我想在发生错误时尽可能快地进行parsing,但是如果遇到问题,可以慢一点。

如果从上面不清楚,我指的是JavaScript的正则expression式引擎 – 尽pipe如果这在引擎之间有所不同,那么也很高兴知道。 我在这里专门在Node.js上工作,也应该在JS引擎中有所不同。

提前致谢!

做2个正则expression式 – 在范围上非常相似 – 几乎总是比单个正则expression式要慢,因为正则expression式是贪婪的(这意味着它们将尽可能地匹配,通常意味着尽可能多的时间) 。

你所要求的基本上是:在最坏的情况下(比如使用.test来从存储器捕获内存)更快的内存比使用额外的内存更快? 答案是否定的,使用额外的内存加快你的过程。

不要拿我的话虽然,这是一个jsperf: http ://jsperf.com/regex-perf-numbers