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

Как работает ленивость в регулярных выражениях?

Друзья, помогите составить регулярку.
Затык в ленивости:

Есть строка вида
какая-то информация // фио персонажа // адрес МОСКВА адрес // еще что-то

Несколько секций с разделителем // .

Собственно, мне нужно вырезать секцию адреса из строки. Адрес может быть в разном формате (как и любой кусок данных), но там всегда присутствует слово МОСКВА

Пишу регулярку //.+?МОСКВА.+?// , вроде указана ленивость, но захватывает она кусок // фио персонажа // адрес МОСКВА адрес // , то есть захватывает лишнего, а именно - ФИО персонажа
В принципе, немного понимая как работает механизм регулярок - то да, так он и должен работать.

Но вот как выцепить только адрес?

Понимаю что это все можно решить с помощью программирования.
Но хотелось бы решить с помощью регулярки, ибо там еще много других нюансов, которые проще решить регуляркой
  • Вопрос задан
  • 120 просмотров
Подписаться 2 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 2
Alexandroppolus
@Alexandroppolus
кодир
https://regex101.com/r/HOpNtj/1

(?:[^/]|(?<!/)/(?!/))*МОСКВА(?:[^/]|(?<!/)/(?!/))*

прикол в том, что номера домов могут содержать дробь, потому вокруг слова "МОСКВА" недостаточно просто написать [^\/]*

PS: по ссылке все слеши без экранирования. Добавь сам при необходимости (зависит от ЯП)
Ответ написан
Комментировать
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
Ленивые квантификаторы - повторять минимальное число раз. Жадные - максимальное число раз. В данном случае проще всего просто выбрать весь текст вокруг целевого слова до слэшей:
/[^\/]*МОСКВА[^\/]*/g
Второй вариант просто - разделить строку на группы, если вам надо работать с несколькими группами. Например:
/(.*?)\/\/(.*?)\/\/(.*?)\/\/(.*)/

Пишу регулярку //.+?МОСКВА.+?// , вроде указана ленивость, но захватывает она кусок // фио персонажа // адрес МОСКВА адрес // , то есть захватывает лишнего, а именно - ФИО персонажа

Возможно вы подумали, что регулярное выражение будет делать поиск назад от слова - но нет, регулярка работает слева направо и по-порядку. В данном случае найти пару слешей - вот оно и находит первую же пару, далее любой символ один или более раз до слова "МОСКВА". Рекомендую почитать мануалы по регулярным выражениям.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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