Страницы

Поиск по вопросам

четверг, 9 января 2020 г.

запомнить необязательную группу в регулярном выражении

#javascript #регулярные_выражения


Имеется ли возможность запомнить значение необязательно группы в регулярном выражении?

Пример, близкий к моему случаю:

Допустим, у меня имеется регулярное выражение

(?:ВАЗ 2666).*(3 литра|10 тонн)


и 3 предложения для проверки

Автомобиль марки ВАЗ 2666 потребляет 3 литра бензина
Автомобиль марки ВАЗ 2666 весит 10 тонн
Автомобиль марки ВАЗ 2666 - это просто мечта!


Что тут получается: обработчик находит первые два предложения и запоминает в них
группы ("3 литра" и "10 тонн" в каждом)..
Что нужно: чтобы обрабочик искал и учитывал все предложения, где встречается "ВАЗ
2666" и если находит "3 литра" или "10 тонн", то запоминал в массив и их..
Пробовал: ставить ? в конце выражения, обработчик ищет нужные предложения, но пропускает
и не запоминает "3 литра" и "10 тонн".

Заранее извиняюсь за сложное объяснение простого вопроса.
    


Ответы

Ответ 1



Сразу замечу, что (?:ВАЗ 2666) = ВАЗ 2666. ВАЗ 2666.*(3 литра|10 тонн)? не сработает, так как .* сразу захватит весь текст до конца строки (это "жадный" шаблон) и не оставит текста для (3 литра|10 тонн)?, который найдет всего лишь пустую строку (да, ведь квантификатор ? позволяет находить "пустое" совпадение). Используйте /ВАЗ 2666(?:.*(3 литра|10 тонн))?/ Подробности ВАЗ 2666 - буквальная подстрока ВАЗ 2666 (?: - начало необязательной (так как после неё стоит квантификатор ?) незахватывающей (так как после скобки стоит ?:, текст, найденный шаблонами в этой группе не будет помещён в отдельный буфер памяти) группы (квантификатор ? "жадный", движок попробует найти все шаблоны в этой группе хотя бы 1 раз, а если не найдёт совпадения, то совпадение все равно будет возвращено, если были найдены предыдущие шаблоны) .* - 0 и более любых символов кроме символа перехода на новую строку (3 литра|10 тонн) - либо 3 литра, либо 10 тонн (эта группа обязательная, т.е. если этот текст есть, он будет помещён в буфер первой захватывающей подмаски) )? - конец необязательной группы. Демо регулярного выражения

Комментариев нет:

Отправить комментарий