#javascript #регулярные_выражения
Доброго времени суток! У меня есть регулярка, предназначенная для поиска форм одного и того же слова в строке. Эти регулярки автоматически генерируются для каждого слова и получаются довольно длинными, но создаются по одному шаблону. Например нужно создать регулярку для поиска форм слова "кот". Берём "базовую" часть регулярки: (^|[^0-9a-zа-я])(кот)([^0-9a-zа-я]|$) и создаём на её основе полную регулярку для всех форм, склеивая из отдельных частей для каждой формы: ((^|[^0-9a-zа-я])(кот)([^0-9a-zа-я]|$)|(^|[^0-9a-zа-я])(котов)([^0-9a-zа-я]|$)|(^|[^0-9a-zа-я])(котам)([^0-9a-zа-я]|$)|(^|[^0-9a-zа-я])(котами)([^0-9a-zа-я]|$)|(^|[^0-9a-zа-я])(котах)([^0-9a-zа-я]|$)|(^|[^0-9a-zа-я])(коту)([^0-9a-zа-я]|$)|(^|[^0-9a-zа-я])(котом)([^0-9a-zа-я]|$)|(^|[^0-9a-zа-я])(коте)([^0-9a-zа-я]|$)|(^|[^0-9a-zа-я])(кота)([^0-9a-zа-я]|$)|(^|[^0-9a-zа-я])(коты)([^0-9a-zа-я]|$)) Получается такая длинная абракадабра. Возьмём некий текст, в котором встречаются формы слова "кот": бла бла кот бла бла "кота" бла коты скоты Мне нужно заменить все вхождения форм слова "кот", ограниченные не словарными символами (пробелами, знаками препинания и тд) на ту же самую форму, обрамлённую угловыми скобками. То есть из исходной строки мне надо получить эту: бла бла <кот> бла бла "<кота>" бла <коты> скоты Я это делаю так: 'бла бла кот бла бла "кота" бла коты скоты'.replace(/моя большая регулярка/gi, '$1<$2>$3') Получается вот что: "бла бла кот <>бла бла "кота"<> бла коты <>скоты" Как можно видеть, мой способ не работает - в строке очень много групп (и в каждой строке их разное количество), и поэтому я не могу пользоваться номерами групп при замене - каждый раз мне будут нужны разные номера. Пробовал использовать такую замену: 'бла бла кот бла бла "кота" бла коты скоты'.replace(/моя большая регулярка/gi, function(match) { return "<" + match + ">"; }) Этот вариант почти работает, выдавая такой результат: "бла бла< кот >бла бла <"кота"> бла< коты >скоты" Но как можно видеть, он "захватывает" внутрь скобок кавычки и пробелы. Подскажите, как в данной ситуации организовать корректную замену? Заранее спасибо! Несколько важных замечаний: Я не могу использовать модификатор \b так как в движке регулярных выражений в JavaScript этот модификатор корректно работает только с латинскими буквами (у меня как правило кириллические тексты) Примерно по той же причине я не могу пользоваться именованными группами - в Js-регулярках они не поддерживаются Сами регулярки несколько упрощены в демонстрационных целях, например, в них нет буквы "ё" и прописных букв. Возможно тут указаны не все формы слова "кот", в данном примере это не столь важно
Ответы
Ответ 1
Всех своих котов сложите во вторую группу захвата console.log('бла бла кот бла бла "кота" бла коты скоты'.replace(/(^|[^0-9a-zа-яё])(кот|котов|котам|котами|котах|коту|коте|котом|кота|коты)([^0-9a-zа-яё]|$)/gi, '$1<$2>$3')); UPD для работы с котами идущими через пробел (1 символ): console.log('котам бла бла кот кот бла бла "кота"кот бла коты скоты котом'.replace(/(^|[^0-9a-zа-яё])(кот|котов|котам|котами|котах|коту|коте|котом|кота|коты)(?![0-9a-zа-яё])/gi, '$1<$2>'));Ответ 2
Вот пример регулярки для вашего вопроса, и для примера я немного изменил пример вашей строки, и все в точности делает так как вы хотите: let str = 'бла бла кот бла &котик* sksdfk котенок бла "кота" бла коты скоты'; let res = str.replace(/([a-zа-яё]*кот[a-zа-яё]*)/gi,'<$1>'); console.log(res);
Комментариев нет:
Отправить комментарий