我试图了解语义版本在nodejs(和npm)中的工作原理。托管 Nodejs 使用的正则表达式的 git 存储库位于 https://github.com/sindresorhus/semver-regex ,但我复制了下面仅有的两行代码。
'use strict';
module.exports = () => /\bv?(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-[\da-z-]+(?:\.[\da-z-]+)*)?(?:\+[\da-z-]+(?:\.[\da-z-]+)*)?\b/ig;
据我所知,这对每个组都使用非捕获组(?:...)
。这是如何运作的?尽管没有捕获任何内容,但匹配似乎返回了值。我错过了一个捕获组吗?这是nodejs中非标准的东西吗?
最佳答案
这显然是为了test
- 它只返回 true
或 false
;
对于 exec
第一个结果将是完整正则表达式入口的值。所以它会是这样的:
// r = /\bv?(?:0|[1-9]\d*)\.(?:...
r.exec('1.0.1');// => Array [ "1.0.1" ];
如果没有 ?:
作为结果,我们将把所有组作为数组值,例如:
// r = /\bv?(0|[1-9]\d*)\.(...
r.exec('1.0.1');// => Array(8) [ "1.0.1", "1", "0", "1", undefined, undefined, undefined, undefined ]
更重要的是,exec
将始终返回正则表达式的结果,作为第一个元素(如果存在),即使您将拥有如下正则表达式:
/(?:a)/.exec('a');// => Array [ "a" ]
我希望我正确理解了问题;
关于javascript - Node.js semver 中的正则表达式非捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50920295/