Что нужно заключить в RegExp, чтобы replace() заменял нужную часть найденной подстроки

Собственно, есть регэксп. Допустим: /( |<)привет/g. Он должен отбирать все "привет", идущие после пробела или "<". Если подставить эту регулярку в replace(), то заменятся, разумеется, не подстроки "привет", а " привет" или "<привет".

console.log('привет<привет'.replace(/( |<)привет/g, 'пока'));        //приветпока

Вопрос: возможно ли сделать регулярку такой, чтобы получилось "привет<пока" - то бишь, чтобы некоторые символы только искались, но не входили в соответствие. Как, например, специальный символ \b.


Ответы (2 шт):

Автор решения: Wiktor Stribiżew

Используйте захватывающую подмаску и обратную ссылку:

console.log('привет<привет'.replace(/([\s<])привет/g, '$1пока'));
// => привет<пока

  • ([\s<]) - Захватывающая подмаска №1: любой пробельный символ или символ <
  • привет - подстрока.

$1 — это обратная ссылка на текст в буфере первой подмаски.

→ Ссылка
Автор решения: vsemozhetbyt

Можно использовать look behind, но это относительно недавнее добавление, поддерживается не во всех браузерах и версиях Node.js:

https://caniuse.com/#feat=js-regexp-lookbehind

https://node.green/#ES2018-features--RegExp-Lookbehind-Assertions

console.log('привет<привет'.replace(/(?<= |<)привет/g, 'пока'));

→ Ссылка