2013-12-06 2 views
1

В конце страницы есть при попытке объяснения того, как сделать жадные, неохотно и притяжательные кванторы работы: http://docs.oracle.com/javase/tutorial/essential/regex/quant.htmlКак именно работает притяжательный квантификатор?

Однако я попробовал себя пример, и я, кажется, не понимают в полной мере.

Я вставлю свои результаты непосредственно:

Enter your regex: .*+foo 
Enter input string to search: xfooxxxxxxfoo 
No match found. 

Enter your regex: (.*)+foo 
Enter input string to search: xfooxxxxxxfoo 
I found the text "xfooxxxxxxfoo" starting at index 0 and ending at index 13. 

Почему первый reg.exp. не найти совпадения, а второй делает? Какая разница между этими двумя reg.exp.?

ответ

5

+ после того, как другой квантификатор означает «не разрешать двигателю регулярных выражений возвращаться к тому, что соответствует предыдущему токену». (См. Руководство по possessive quantifiers здесь).

Поэтому, когда вы применяете .*foo к "xfooxxxxxxfoo", .* сначала соответствует всей строке. Затем, так как foo не может быть сопоставлен, двигатель регулярного выражения отступает до тех пор, пока это невозможно, достигнув соответствия, когда .* соответствует "xfooxxxxxx" и foo соответствует "foo".

В настоящее время дополнительный + предотвращает это отключение, поэтому совпадение не выполняется.

Когда вы пишете (.*)+foo. + имеет совершенно иное значение; теперь это означает «один или несколько предыдущих маркеров». Кстати, вы создали вложенные кванторы, что, кстати, не очень хорошо. Если вы примените это регулярное выражение к строке, как "xfoxxxxxxxxxfox", вы столкнетесь с catastrophic backtracking.

+0

Ваш ответ дал мне больше, чем я просил. Я думаю, это объясняет все, что нужно знать о квантификаторах. – Ariel

+0

@Ariel: Спасибо, но есть много больше для квантификаторов, чем это :) –

+0

Нравится что? Что еще я должен знать о квантификаторах? – Ariel

0

Притяжательный квантор принимает строку целую строку и проверяет, совпадает ли она, если она не сработала. В вашем случае xfooxxxxxxfoo соответствует .*+, но затем вы запрашиваете еще одинfoo, которого нет, поэтому сбой завершен.

жадный квантор первый делает то же самое, но вместо того, чтобы не суметь его «отступает» и пытается снова:

xfooxxxxxxfoo fail 
xfooxxxxxxfo fail 
xfooxxxxxxf fail 
xfooxxxxxx match 

В вашем втором регулярном выражении вы просите что-то другое, путая механизм группировки. Вы запрашиваете «одно или несколько совпадений (. *)», Поскольку + теперь относится к(), и есть одно совпадение.

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