在semver

时间:2018-06-19 03:40:27

标签: javascript node.js regex semantic-versioning

我试图理解语义版本在nodejs(和npm)中是如何工作的。承载nodejs使用的正则表达式的git repo位于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中是非标准的吗?

1 个答案:

答案 0 :(得分:-1)

显然test - 它只是返回truefalse;
对于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" ]

我希望,我理解正确的问题;