#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 тонн (эта группа обязательная, т.е. если этот текст есть, он будет помещён в буфер первой захватывающей подмаски) )? - конец необязательной группы. Демо регулярного выражения
Комментариев нет:
Отправить комментарий