Почему это не соответствует всему тексту?
О, это пробовали. Но он нашел последовательность p
, r
, o
, j
, 1
в одном месте, потом пошел дальше, чтобы найти ноль или более символов не запятая, поэтому соответствие .
, p
, d
, f
. И он остановился там, так как следующий символ, будучи запятой, не соответствовал [^,]
.
Обратите внимание, что следующая попытка совпадения начнется с следующего символа, то есть r
, и так далее, пока не найдет p
; когда он находит, то он будет пытаться r
, и т.д. и т.п.
регулярное выражение удовлетворившись во всей своей полноте, двигатель решил, что это был успех, и не пытаться дальше, несмотря на то, являются матчи вне что точка.
текст соответствует поэтому proj1.pdf
. И не весь вход.Регулярные выражения ленивы, они соответствуют только тем, что им нужно, и никогда не идут дальше.
НО. И здесь это становится интересным. Некоторые двигатели работают не так.
Рассмотрите регулярное выражение cat(|flap)
и текст ввода catflap
. POSIX запустил движки регулярных выражений и продиктовал, что механизм регулярных выражений должен соответствовать самому левому, самому длинному совпадению.
Итак, если двигатель регулярных выражений подчиняется POSIX, он должен соответствовать catflap
. Но большинство двигателей регулярных выражений, существующих здесь, будут соответствовать только cat
: сначала выполняется пустая чередование, регулярное выражение выполнено, конец истории!
Теперь к сути вопроса: квантификаторы из трех типов, жадных, ленивых и притяжательных:
- жадный: по умолчанию,
*
;
- ленивый, он же злоупотреблял:
*?
;
- Привлечение:
*+
.
Жадный квантификатор попытается сопоставить как можно больше текста и вернуть его только тогда, когда это необходимо; ленивый квантификатор будет стараться и соответствовать как можно меньше текста; притяжательный квантификатор попытается сопоставить столько текста, сколько он может, и он не будет дать текст обратно.
Иллюстрация: здесь ввод текст:
The answer to everything is 42, says the mouse
Вот три регулярные выражения, чтобы соответствовать этому тексту, с группой захвата:
.*(\d+)
(жадные);
.*?(\d+)
(ленивый);
.*+(\d+)
(Притяжательный).
Вопрос: что группа будет захватывать в каждом из этих выражений? Ответ:
- первый:
2
;
- второе:
42
;
- третий: даже не соответствует тексту!
.*+
проглотит все, но не вернет, \d+
поэтому не содержит ничего, что может быть сопряжено, сбой регулярных выражений.
Извините, что раньше не было ясно. Я имел в виду, что предположим, что я даю источник как «xfooxxfoo» и regex as.* foo, то в этом случае, почему весь исходный код (т. е. xfooxxfoo) сопоставляется? Почему в приведенном выше примере не так? – user2223211