JS Regex, как заменить только захваченные группы?

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

name="some_text_0_some_text"

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

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

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

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

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

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

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

name="some_text_!NEW_ID!_some_text"

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

Ответ 1

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

str.replace(/(.*value="\w+)(\d+)(\w+".*)/, "$1!NEW_ID!$3")

Ответ 2

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

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

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

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

Пример/тест здесь: https://codepen.io/jogai/full/oyNXBX

Ответ 3

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

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);