Понимание квантификаторов притяжений, регулярное выражение Java - PullRequest
1 голос
/ 26 июня 2011

Я понимаю, что положительное регулярное выражение будет идти до конца текста и не будет возвращаться, чтобы увидеть, было ли совпадение до конца.Если в конце есть совпадение, он возвращает истину, иначе он немедленно возвращает ложь.Я подделал это:

Pattern patt = Pattern.compile(".*+foo");
Matcher matcher = patt.matcher("xxfooxxxxxfooxxxfoo");
while (matcher.find())
    System.out.println(matcher.group());

Это ничего не дает мне, хотя в конце есть совпадение.Есть идеи, почему?

Также я понимаю, что чтобы сделать регулярное выражение ленивым / притяжательным, я добавляю? / + После первого квантификатора (то есть *? Или * +).Это правильно?Спасибо!

Ответы [ 2 ]

3 голосов
/ 26 июня 2011

Это ничего не дает мне, хотя в конце концов есть совпадение. Есть идеи почему?

.*+ будет соответствовать всей входной строке (включая последнюю foo). И поскольку он не возвращается назад от конца строки, регулярное выражение .*+foo не совпадает.

Также я понимаю, что чтобы сделать регулярное выражение ленивым / притяжательным, я добавляю? / + После первого квантификатора (т.е. *? Или * +). Это правильно?

Встречная часть притяжательных не ленивый. Это было бы жадным, по умолчанию *.

Итак, регулярное выражение .*?foo будет соответствовать "xxfoo", а регулярное выражение .*foo будет соответствовать "xxfooxxxxxfooxxxfoo".

1 голос
/ 26 июня 2011

Притяжательные квантификаторы не откажутся от матчей при возврате..*+ соответствует всей вашей строке, и для foo ничего не найдено.

Э-э, как сказал Барт.:)

Используйте квантификаторы собственников только в том случае, если вы знаете, что то, что вы сопоставили, никогда не будет возвращено (например, [^f]*+.*foo или, если вы знаете , что только символы "f" будутбыть в начале "foo", [^f]*+foo).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...