Что нужно заключить в RegExp, чтобы replace() заменял нужную часть найденной подстроки
Собственно, есть регэксп. Допустим: /( |<)привет/g. Он должен отбирать все "привет", идущие после пробела или "<". Если подставить эту регулярку в replace(), то заменятся, разумеется, не подстроки "привет", а " привет" или "<привет".
console.log('привет<привет'.replace(/( |<)привет/g, 'пока')); //приветпока
Вопрос: возможно ли сделать регулярку такой, чтобы получилось "привет<пока" - то бишь, чтобы некоторые символы только искались, но не входили в соответствие. Как, например, специальный символ \b.
Ответы (2 шт):
Используйте захватывающую подмаску и обратную ссылку:
console.log('привет<привет'.replace(/([\s<])привет/g, '$1пока'));
// => привет<пока
([\s<])- Захватывающая подмаска №1: любой пробельный символ или символ<привет- подстрока.
$1 — это обратная ссылка на текст в буфере первой подмаски.
Можно использовать look behind, но это относительно недавнее добавление, поддерживается не во всех браузерах и версиях Node.js:
https://caniuse.com/#feat=js-regexp-lookbehind
https://node.green/#ES2018-features--RegExp-Lookbehind-Assertions
console.log('привет<привет'.replace(/(?<= |<)привет/g, 'пока'));