@ivanov237461

Как осуществить поиск слова в строке с разными окончаниями (регулярное выражение)?

У меня не давно возникла ситуация поиска слова в строке при помощи регулярного выражения. Проблема в том, что у слова могут быть различные окончания, также искомое слово может находиться в любой части строки, как и в начале, середине так и в конце.
  • Вопрос задан
  • 14588 просмотров
Пригласить эксперта
Ответы на вопрос 3
valemak
@valemak
Фрилансер
Ну вот, накарябал первое что пришло в голову.

(^|\A|\s|\-)[Сс]лов.*?(\s|$|\Z|\-)

Предположим нам нужно найти слово слово.
Корень - слов.
Перед словом может быть: начало строки, начало текста, пробел или дефис.
Может начинаться как с маленькой так и с большой буквы.
После слова может быть - пробел, конец строки, конец текста, дефис.

Правда регулярка возвращает слово с различными окончаниями + знак препинания. который может идти сразу после слова (дефис, запятая, точка, двоеточие и прочие). Знак препинания можно вырезать уже другой регуляркой с помощью preg_replace ;)

UPD. Также, увы, будет цеплять однокренные слова и просто начинающиеся аналогично. То есть в данном случае словосочетание, словил, словно и т.п. Наверное, в регулярке придётся перечислить все возможные окончания:

(^|\A|\s|\-)[Сс]лов(о|а|ом|у|ам|ами|е)?[^а-яА-Я]*?(\s|$|\Z|\-)

То есть после корня перечисляем ВСЕ возможные окончания для данного слова, затем могут быть знаки препинания (в данном случае субпаттерн - не русские буквы). Знаки препинания и пробел в конце вырезать дополнительно из результатов поиска по этой регулярке.

Регулярка сырая, вроде работает, но подробно не тестировал. Думаю, общее направление Вам понятно :)
Ответ написан
@b2afb924
\bслов\S*\b
Ответ написан
Комментировать
@svm
(?<=\s|^)слов.*?(?=\s|$)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы