免责声明:我的问题不是专注于练习,它只是一个例子(尽管如果你对这个例子本身有任何有趣的提示,请随时分享!)。
假设我正在使用JavaScript中的Regex解析一些字符串,我主要关注的是性能(速度)。
我有一个正则表达式检查数字字符串,然后使用Number
解析它,如果它是数字:
if (/^\[[0-9]+]$/.test(str)) {
val = Number(str.match(/^\[([0-9]+)$/)[1]);
}
请注意条件测试如何在数字周围没有捕获组。这导致基本上写出两次相同的正则表达式,除了第二次使用捕获组。
我想知道的是这个;是否在某个条件下向test()
旁边的正则表达式添加捕获组会以任何方式影响性能?我想在这两个地方使用捕获正则表达式,只要没有性能损失。
关于我为什么要test()
然后match()
而不是match()
并检查null
的问题;我希望在错过的时候尽可能快地解析,但是当遇到命中时可以稍慢一些。
如果从上面不清楚,我指的是JavaScript的正则表达式引擎 - 虽然如果这在引擎上有所不同,那么也很高兴知道。我在这里专门研究Node.js,如果JS引擎也不同。
提前致谢!
答案 0 :(得分:1)
做2个正则表达式 - 在范围上非常相似 - 几乎总是比单个正则表达式慢,因为正则表达式是贪婪的(这意味着它们将尝试尽可能多地匹配,通常意味着占用最大量的时间可能)。
你所要问的基本上是:在最坏的情况下(也就是使用.test
从捕获中节省内存)更少的内存是否比使用额外的内存更快?答案是否定的,使用额外的内存可以加快您的流程。
不要相信我的话,这里有一个jsperf:http://jsperf.com/regex-perf-numbers