RegEx для возврата только соответствующей группы, используя только метод замены - PullRequest
1 голос
/ 01 июля 2019

Есть ли способ вернуть только подходящую группу, используя только replace?

У меня есть эта строка,

"xml версия 2.1.2-изумруд https://www.example.com"

и я хочу вытащить версию из нее.

Я использую этот RegEx:

const regex = /\sversion\s(.*?)\s/;
const str = `xml version 2.1.2-emerald https://www.example.com`;
const subst = `$1`;
const result = str.replace(regex, subst);

console.log('Substitution result: ', result); 
// desired result: "2.1.2-emerald"

За исключением того, что я хочу, чтобы результат содержал только совпадение. Есть ли способ сделать это с помощью метода replace()?

Ответы [ 2 ]

2 голосов
/ 01 июля 2019

Вместо replace вместо match и извлечение первой захваченной группы.Вы также можете использовать (\S+) вместо (.*?)\s:

const regex = /\sversion\s(\S+)/;
const str = `xml version 2.1.2-emerald https://www.example.com`;
const result = str.match(regex);
console.log(result[1]);

Если совпадений может не быть, проверьте, что результат не null первый:

const regex = /\sversion\s(.*?)\s/;
const str = `foo bar`;
const result = str.match(regex);
if (result) {
  console.log(result[1]);
}

Если вы хотите, чтобы полное совпадение было именно тем, что вы ищете, вы можете использовать lookbehind, хотя это будет работать только в новых браузерах и не очень хорошокросс-браузерное решение:

const regex = /(?<=\sversion\s)\S+/;
const str = `xml version 2.1.2-emerald https://www.example.com`;
const result = str.match(regex);
console.log(result[0]);
1 голос
/ 01 июля 2019

Да, ключ состоит в том, чтобы полностью собрать все строковые данные, а затем заменить их на желаемую группу:

const regex = /.*\sversion\s(.*?)\s.*/gs;
const str = `xml version 2.1.2-emerald https://www.example.com`;
const subst = `$1`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);
...