Окончательное решение (надеюсь)
Похоже, что groups
доступно только в ECMAScript 2020
. Ссылка 1 , Ссылка 2 .
В качестве обходного пути я нашел следующее решение:
const str = `hello
!hello
some other text !hello more text
ahello
this is a test hello !hello
JvdV is saying hello
helloing or helloed =).`;
function collectGroups(regExp, str) {
const groups = [];
str.replace(regExp, (fullMatch, group1, group2) => {
groups.push(group1 || group2);
});
return groups;
}
const regex = /^(hello)|(?:!)(hello\b)/g;
const groups = collectGroups(regex, str)
console.log(groups)
/(?=!)?(\bhello\b)/g
должен это сделать. Детская площадка .
Пример:
const regexp = /(?=!)?(\bhello\b)/g;
const str = `
hello
!hello
some other text !hello more text
ahello
`;
const found = str.match(regexp)
console.log(found)
Объяснение:
Примечание. Если вы также убедитесь, что hello не должен заменяться ! , тогда вы можете просто добавить отрицательный взгляд, например, так: /(?=!)?(\bhello\b)(?!!)/g
.
Обновление
Благодаря подсказке @JvdV в комментарии я теперь адаптировал регулярное выражение, которое должно соответствовать вашим требованиям:
/(^hello\b)|(?:!)(hello\b)/gm
Детская площадка: https://regex101.com/r/CXXPHK/4 ( Объяснение также можно найти на странице).
Обновление 2:
Похоже, группа без захвата (?:!)
не работает ну в JavaScript, то есть я получаю соответствующий результат как ["hello", "!hello", "!hello", "!hello"]
, где также включено !
, Но кого это волнует, вот обходной путь:
const regex = /(^hello\b)|(?:!)(hello\b)/gm;
const found = (str.match(regex) || []).map(m => m.replace(/^!/, ''));