2013-06-19 2 views
0

Я читал K.Sierra и нашел следующую Sentance:Жадные кванторы

жадный квантор делает фактически считывать данные всего источника, а затем он работает назад (справа), пока он не найдет самый правый матч. В этот момент он включает в себя все, начиная с ранее в исходных данных и вплоть до данных, которые является частью самого правого матча.

Теперь предположим, что мы имеем источник следующим образом:

"proj3.txt,proj1sched.pdf,proj1,proj2,proj1.java" 

и модель: proj1([^,])*

почему она не соответствует весь текст? Будучи жадным, он должен соответствовать самому правому «proj1.java», и вернувшийся матч должен был быть всем источником до самого правильного матча? Вместо этого он возвращает:

proj1sched.pdf 
proj1 
proj1.java 
+0

Извините, что раньше не было ясно. Я имел в виду, что предположим, что я даю источник как «xfooxxfoo» и regex as.* foo, то в этом случае, почему весь исходный код (т. е. xfooxxfoo) сопоставляется? Почему в приведенном выше примере не так? – user2223211

ответ

2

почему она не соответствует всему тексту?

Потому что вы заявили, что необходимо начать с proj1

Будучи жадным он должен иметь соответствовать самым правым "proj1.java"

правильно.

, а возвращенный матч должен был быть источником всего до самого правильного матча?

Не знаю, почему вы думаете об этом или почему это было бы полезно. Вы можете просто сделать .*proj1.*, если это то, что вы хотите.

0

Почему это не соответствует всему тексту?

О, это пробовали. Но он нашел последовательность 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+ поэтому не содержит ничего, что может быть сопряжено, сбой регулярных выражений.
-1

Мы proj1([^,])*, в которых -

([^,])* означает, что он будет сцеплять подстроку из любой комбинации символов (произошло ноль или более раз), который не состоит из символа «» со строкой " proj1 ": " sched.pdf "или" .java "все три не включают символ ','. Отсюда и результат.

Смежные вопросы