Задать вопрос
@Ankozar

Как с помощью регулярок на js заменить в тексте слова, которые могут ялвяться частью других слов?

Нужно в тексте все формы слова дума(ы, у) заменить на Дума(ы, у).
Но при этом корень дум может быть частью слов вроде "думать", "думающий" и т.д.

Если я пишу /дум./, то он находит и в словах типа "думать".

В общем, нужно проверить, что после "дум" стоит один символ и заменить только в этом случае. Но без этого символа, чтобы не писать все варианты окнчаний.

upd
в моём случае достаточным оказалось вот такое решение
replace(/(\sдум(?=(.\s)))|(\sдум(?=(..\s)))/gi, " Дум")
  • Вопрос задан
  • 103 просмотра
Подписаться 2 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Регулярные выражения не инструмент, который умеет понимать корень слова. Как уже написали в комментариях, с числом букв споткнётесь о коллизию «думой» vs «думал» – первое надо капитализировать, второе нет.

Так что предложил бы засучить рукава и перечислить все словоформы явно. Но и это не гарантирует безошибочность: подставят переносы слова, или омонимы.
Омонимы сидели в баре, развалившись, как баре.


В помощь
учебник по регулярным выражениям.

Граница слова: \b — работает только для ASCII, не годится для Unicode кириллицы.

Unicode и флаг "u"

Вариант выражения
/дум.?(?=$|\s)/u – один опциональный символ, и смотреть вперёд, чтобы там был или конец строки или пробельный символ.

const m = str => str.match(/дум.?(?=$|\s)/u);
m('ду') // null
m('дум') // ["дум"]
m('дума') // ["дума"]
m('думать') // null


Вам нужно ещё разобраться и самостоятельно сделать такую же проверку до искомой строки: чтобы там было начало строки ^ или пробельный символ.
Ответ написан
Ваш ответ на вопрос

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

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