Группа без регулярного выражения Node.js в semver

Я пытаюсь понять, как семантическая версия работает в nodejs (и npm). Репозиторий git, в котором размещено регулярное выражение, используемое nodejs, находится здесь 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 ответ

Это очевидно для 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" ]

Надеюсь, я правильно понял вопрос;

Другие вопросы по тегам