Сопоставьте список слов без списка символов вокруг

у меня есть это регулярное выражение

(?:$|^| )(one|common|word|or|another)(?:$|^| )

, который соответствует хорошо, если два слова находятся рядом друг с другом.

One one's more word'word common word or another word more another 

More and more years to match one or more other strings

And common word things and or

в приведенном выше его матчей one во второй строке, но не or просто рядом с ним. Же для common и word int третья строка.

Живой Пример:http://regex101.com/r/hV3wQ3

Я считаю, что это связано с числом несоответствующих групп. Но, я не уверен, как достичь конечной цели соответствия всего списка слов без каких-либо символов вокруг них.

Я не хочу one на one's или же слово word'word быть согласованы.

2 ответов


поскольку ваши группы захвата явно определяют один символ по обе стороны от общего слова, он ищет space word space а затем, когда он не находит другого space, это не удается.

в этом случае, так как вы не хотите, чтобы соответствовать всем символам границы слова поймали (точка, апостроф и т. д.) вам нужно использовать немного обмана с lookaheads, lookbehinds и группами без захвата. Пытаться это:

(?:^|(?<= ))(one|common|word|or|another)(?:(?= )|$)

http://regex101.com/r/cM9hD8

границы слов по-прежнему проще реализовать, поэтому для справки вы также можете сделать это (хотя это будет включать ', ., etc.).

\b(one|common|word|or|another)\b

можно использовать .

Он не будет соответствовать one's , someone, etc...

Регистрация демо