JS Regex, как заменить только захваченные группы? - PullRequest
141 голосов
/ 17 октября 2010

Хорошо, вопрос довольно прост.Я ищу строку вроде этой:

name="some_text_0_some_text"

У меня есть HTML-код до и после строки выше.

Теперь я хотел бы заменить0 чем-то вроде:! NEW_ID!

Итак, я сделал простое регулярное выражение:

.*name="\w+(\d+)\w+".*

Но я не вижу, как заменить исключительно захваченный блок.

Есть ли способ заменить захваченный результат, например ($ 1), какой-нибудь другой строкой?

Результат будет:

name="some_text_!NEW_ID!_some_text"

Спасибо за вашу помощь:)

Ответы [ 3 ]

280 голосов
/ 17 октября 2010

Решение заключается в добавлении захватов для предыдущего и следующего текста:

str.replace(/(.*value="\w+)(\d+)(\w+".*)/, "$1!NEW_ID!$3")
1 голос
/ 29 мая 2018

Небольшое улучшение в ответе Мэтью может быть предвкушением вместо последней группы захвата:

.replace(/(\w+)(\d+)(?=\w+)/, "$1!NEW_ID!");

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

.split(/\d+/).join("!NEW_ID!");

Пример / эталонный тест здесь: https://codepen.io/jogai/full/oyNXBX

0 голосов
/ 25 июня 2019

Более простой вариант - просто захватить цифры и заменить их.

const name = 'preceding_text_0_following_text';
const matcher = /(\d+)/;

// Replace with whatever you would like
const newName = name.replace(matcher, 'NEW_STUFF');
console.log("Full replace", newName);

// Perform work on the match and replace using a function
// In this case increment it using an arrow function
const incrementedName = name.replace(matcher, (match) => ++match);
console.log("Increment", incrementedName);

Ресурсы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...