@malman
прогер

Почему в данном регулярном выражении ленивый квантификатор не учитывает кавычку?

Я изучаю регулярные выражения и наткнулся на проблему, вот код:
let str = '...<a href="link1" class="wrong">... <p style="" class="doc">...';
let regexp = /<a href=".*?" class="doc">/g;
alert( str.match(regexp) );

Он выводит всю строку.
По идее он находит первую кавычку и должен искать совпадение со следующим символом в регулярном выражении, то есть с ". Он его не находит и должен переходить к следующему символу, то есть к l. Когда он встречает " он должен остановится и продолжить сравнивать с class="doc", но он этого не делает, почему?
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 2
@CyclusVitalis
Все не так. Ленивый захват .*? говорит, что надо брать по одному символу и сверять дальше строку с хвостом " class="doc">. Если хвоста нет, то снова брать одни символ и снова сравнивать с хвостом. А если бы у вас был не ленивый захват .*, то регулярка захватила бы все возможные символы до конца текста, а потом, при не совпадении с хвостом, убирала бы из захвата по одному символу.

Хорошо смотреть тут https://regex101.com/r/pgZ6DA/1
Режим PCRE (PHP) для запуска Regex Debugger. Запустите дебагер и смотрите как работает регулярка.
Потом уберите знак вопроса из регулярки и снова в дебагере посмотрите работу регулярки.

P.S. Чтобы не возникало таких непоняток, лучше вместо ленивого захвата всех возможных символов, использовать ограничение по захвату [^"]* (все символы, кроме двойных кавычек).
Ответ написан
dollar
@dollar
let str = '...<a href="link1" class="wrong">... <p style="" class="doc">...';
let regexp = /<a href="[^"]*?" class="doc">/g;
alert( str.match(regexp) );
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы