2016-05-26 3 views
0

У меня есть входная строка s="blah, blah.blah blah foöblah blah"Как соответствовать все вхождению слова, не включая разделители в результатах

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

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

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

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

+0

Почему вы не просто замените '/ \ bblah \ b /' на 'x' – ClasG

+0

забыли упомянуть: у меня также могут быть акцентированные символы в строке ввода – someday

ответ

1

Использование word boundary \b

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

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

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


UPDATE:

с вашим собственным регулярное выражение вам нужно ESCA ре . по \. и при замене добавить захваченное значение группы с помощью строки $1 Regex explanation here

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

+0

Я забыл упомянуть, что у меня могут быть акцентированные символы à, é и т. д. в моей строке ввода. Таким образом, границы слов могут не работать – someday

+0

@ user3733345: проверить второй фрагмент –

+0

Я понял, что вам нужно сбежать '.' Он предотвращает ложные совпадения. Но я не следую за $ 1x. Как это работает здесь? – someday

0

Вы могли бы заменить /\bblah\b/ с x.

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

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

Edit:

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

(^|[^\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!

+0

Я забыл упомянуть, что в моей строке ввода я мог бы иметь такие символы, как à, é и т. Д. Таким образом, границы слов могут не работать – someday

+0

Это не так, потому что javascript обнаружит границу слова в 'foöblah' после' ö' – someday

Смежные вопросы