【问题标题】:Node.js regular expression non-capture group in semversemver中的Node.js正则表达式非捕获组
【发布时间】:2018-11-27 22:31:52
【问题描述】:

我试图了解语义版本在 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 中是非标准的吗?

【问题讨论】:

  • 完全错了。它匹配不符合semver 规范的字符串,如果不匹配合法的字符串。

标签: javascript node.js regex semantic-versioning


【解决方案1】:

显然是针对test - 它只是返回truefalse
对于exec,第一个结果将是 full 正则表达式入口的值。所以它会是这样的:

// 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" ]

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

【讨论】:

  • 是的,这非常有帮助。 exec 似乎有一个隐式捕获组。
  • 是的,它返回 true 或 false,但它不是一个 semver 判别器,它会为不符合要求的字符串产生误报,对符合要求的字符串产生误报。
猜你喜欢
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 2019-01-12
  • 1970-01-01
相关资源
最近更新 更多