javascript - 在 RegExp#test 中使用捕获组是否会降低性能?

标签 javascript regex node.js

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

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

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

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

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

我想知道的是这个;将捕获组添加到与 test() 一起使用的正则表达式中是否会以任何方式影响性能?我只想在两个地方都使用捕获正则表达式,只要不影响性能即可。

关于为什么我先做 test() 然后 match() 而不是 match() 然后检查 ;我希望在出现未命中时尽可能快地解析,但在命中时稍微慢一点也可以。

如果上面的内容还不清楚,我指的是 JavaScript 的正则表达式引擎——尽管如果这在不同的引擎中有所不同,那么也很高兴知道。我在这里专门从事 Node.js 工作,它是否也因 JS 引擎而异。

提前致谢!

最佳答案

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

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

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

关于javascript - 在 RegExp#test 中使用捕获组是否会降低性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33326414/

相关文章:

javascript - Fetch API 中的请求信号属性

javascript - 单击时更改背景颜色

php - preg_match_all 用逗号分隔,值可能包含空格

java - 匹配时忽略 html 标签的正则表达式

javascript - 如果方 block 的颜色刚刚更改,如何延迟更改网格中方 block 的背景颜色?

JavaScript - 检查函数的最佳实践

java - 正则表达式查找具有空值的属性

javascript - node.js 和 socket.io 代码不工作

javascript - 尽管使用缓冲区调用,文件类型 npm 模块仍返回 null,我做错了什么?

Javascript - 回调的优点