Регулярное выражение: поиск с возвратом в кванторе притяжательности

Я просматривал тест и заметил, что квантификатор притяжательности действительно работает в str.split(). поэтому я написал следующий код:

String str = "aaaaab";

if(str.matches("a*+b"))
    System.out.println("I backtrack");
else
    System.out.println("Nope.");

При запуске это выводит I backtrack. Вот почему это сбивает с толку: мне сказали, что притяжательный квантификатор никогда не отменяется, так зачем a*+ отказываться от b в строке?

Что мне нужно, так это более подробное объяснение того, когда притяжательные квантификаторы отступают.


person Funny Geeks    schedule 13.02.2017    source источник
comment
Почему a*+ потребляет b? Это единственный сценарий, при котором произойдет откат. Но это не так.   -  person f1sh    schedule 13.02.2017
comment
Попробуйте это с .*+b против .*b (или [ab]*+b против [ab]*b, если вы хотите быть более конкретным)   -  person Aaron    schedule 13.02.2017
comment
Ссылка: regular-expressions.info/possessive.html.   -  person Alfonso Nishikawa    schedule 13.02.2017


Ответы (1)


В вашем примере нет возврата.

Вы говорите «любое количество a символов». Итак, движок соберет эти 5 символов a и затем остановится; чтобы затем найти b.

Вот и все.

Отслеживание с возвратом означает, что движок должен "отследить" после того, как собрал слишком много входной строки; см. здесь для примера этого.

И помимо этого: ваше условие if возвращает true, когда шаблон соответствует входным данным. Ваш вывод о том, что это означает «откат», неверен:

Матч есть матч; независимо от того, должен ли двигатель отступить, чтобы соответствовать (или нет). Другими словами: ваш маленький тест ничего вам не говорит (он только говорит вам, соответствует ли ввод заданному шаблону; точка).

person GhostCat    schedule 13.02.2017