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