Как сопоставить все вхождения слова без включения разделителей в результаты

У меня есть входная строка s="blah, blah.blah blah foöblah blah"

Рассматривая whitespace, , и . как разделители, я хочу сопоставить все вхождения целых слов blah, например. после замены желаемого совпадения на x выше строка должна выглядеть как x, x.x x foöblah x

Я пытался следовать регулярному выражению /(?:\s|.|,|^)blah(?=\s|.|,|$)/g, но у него есть следующие проблемы

  1. Он соответствует blah в foöblah
  2. Он включает сопоставление с окружающими разделителями, что нежелательно. Мне нужна только ерунда

EDIT#1: входная строка s может содержать символы с диакритическими знаками, поэтому использование границ слов в качестве регулярного выражения не будет работать.


person someday    schedule 26.05.2016    source источник
comment
Почему бы вам просто не заменить /\bblah\b/ на x   -  person SamWhan    schedule 26.05.2016
comment
забыл упомянуть: у меня также могут быть символы с диакритическими знаками в моей строке ввода   -  person someday    schedule 26.05.2016


Ответы (2)


Используйте границу слов \b.

Соответствует границе слова. Граница слова соответствует положению, в котором за символом слова не следует или не предшествует другой символ слова. Обратите внимание, что совпадающая граница слова не включается в сопоставление. Другими словами, длина совпадающей границы слова равна нулю. (Не путать с [\b].)

Примеры: /\bm/ соответствует 'm' в слове "moon" ; /oo\b/ не соответствует 'oo' в слове "moon", потому что за 'oo' следует 'n', который является символом слова; /oon\b/ соответствует «oon» в «moon», потому что «oon» — это конец строки, за которым не следует символ слова; /\w\b\w/ никогда не будет соответствовать чему-либо, потому что за словесным символом никогда не может следовать как несловный, так и словесный символ.(Взято отсюда)

s = "blah, blah.blah blah fooblah blah";
console.log(
  s.replace(/\bblah\b/g, 'x')
)


ОБНОВЛЕНИЕ:

С вашим собственным регулярным выражением вам нужно экранировать . на \. и при замене добавить захваченное значение группы строкой, используя $1 Объяснение регулярного выражения здесь

s = "blah, blah.blah blah fooblah blah";
console.log(
  s.replace(/(\s|\.|,|^)blah(?=\s|\.|,|$)/g, '$1x')
)

person Pranav C Balan    schedule 26.05.2016
comment
Я забыл упомянуть, что во входной строке у меня могли быть акцентированные символы, такие как à, é и т. Д. Так что границы слов могут не работать - person someday; 26.05.2016
comment
@ user3733345 : проверьте второй фрагмент - person Pranav C Balan; 26.05.2016
comment
Я понял необходимость экранирования . Это предотвращает ложные совпадения. Но я не слежу за $1x здесь. Как здесь работает? - person someday; 26.05.2016
comment
@user3733345 $1 относится к первой захваченной группе - person Pranav C Balan; 26.05.2016
comment
первая захваченная группа в этом случае blah ...правильно? И вы заменяете каждое совпадение на blahx. Тогда почему я получаю только x в результате? Что мне здесь не хватает - person someday; 26.05.2016
comment
@user3733345 : developer.mozilla.org /en-US/docs/Web/JavaScript/Reference/ - person Pranav C Balan; 26.05.2016
comment
@ user3733345 : здесь захвачена группа (\s|\.|,|^) - person Pranav C Balan; 26.05.2016

Вы можете заменить /\bblah\b/ на x.

document.writeln('blah, blah.blah blah fooblah blah'.replace(/\bblah\b/g, 'x'));

\b гарантирует, что это начало или конец слова.

Изменить:

Если вы используете

(^|[^\w\x80-\xff])blah(?![\w\x80-\xff])

и заменить на

$1x

Я верю, что ты получишь то, что хочешь.

document.writeln('blah, blah.blah blah! foöblah blah éblah'.replace(/(^|[^\w\x80-\xff])blah(?![\w\x80-\xff])/g, '$1x'));

Это похоже на решение Pranav, но будет обрабатывать все знаки препинания, например. blah!

person SamWhan    schedule 26.05.2016
comment
Я забыл упомянуть, что во входной строке у меня могли быть акцентированные символы, такие как à, é и т. Д. Так что границы слов могут не работать - person someday; 26.05.2016
comment
Этого не произойдет, потому что javascript обнаружит границу слова в foöblah после ö - person someday; 26.05.2016