Найти одно из слов в тексте (точное совпадение)

Есть строка:

"что-то кто-то"

Нужно найти - есть ли в ней точное совпадение одного из слов. Искать "что" и "кто".

Те чтобы "что-то" не совпадало с "что", так же как и "кто-то" с "кто".

Делаю так:

.*(\bчто\s|\bкто\s).*

В итоге получается. Но может так случиться что в искомой строке "что" - может поменяться на "что-то".Так же с "кто".

Тестю так:

1) .*(\bчто-то\s|\bкто\s).*.  - работает
2) .*(\bчто\s|\bкто-то\s).*.  - нет

Понятно почему оно не работает. Флаг \s - это символ - пробел||tab||пренос строки. А в тексте после "кто-то" нет никаких символов - это конец строки.

Как сделать так - чтобы в любом случае отрабатывало ? Нужно использовать одинаковый набор спец символов. Те понятно что решение:

.*(\bчто\s|\bкто\Z).*

отработает, но нужно чтобы была комбинация [\s или \Z] . Я пытаюсь делать так:

.*(\bчто[\s|\Z]|\bкто[\s|\Z]).*

не хочет отрабатывать. Подскажите пожалуйста как сделать правильно.


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

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

Используйте

\b([кч]то)(\Z|\s)

Если необходимо совпадение целой строки, добавьте .* по краям:

.*\b([кч]то)(\Z|\s).*

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

.*\b(кто|что|ещё)(\Z|\s).*

Если можно использовать незахватывающие подмаски, используйте

.*\b(кто|что|ещё)(?:\Z|\s).*

Однако POSIX их обычно не поддерживает (так же как и \Z впрочем).

→ Ссылка