Причина поведения неохотного квантификаторав регулярном выражении Java - PullRequest
2 голосов
/ 28 марта 2012

Я знаю, что ? - это жадный квантификатор, а ?? - неохотный для него. Когда я использую его следующим образом, он всегда дает пустой вывод? Это из-за того, что оно всегда действует слева направо (сначала смотря на нулевое вхождение, а затем совпадающее вхождение) или другое?

    Pattern pattern = Pattern.compile("a??");
    Matcher matcher = pattern.matcher("aba");
    while(matcher.find()){
        System.out.println(matcher.start()+"["+matcher.group()+"]"+matcher.end());
    }

Выход:

0[]0
1[]1
2[]2
3[]3

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

Ваше регулярное выражение может быть объяснено следующим образом: «попытаться сопоставить ноль символов, а если это не удастся, попытаться сопоставить один символ« а »».

Попытка сопоставить ноль символов всегда будет успешной, поэтомуна самом деле нет цели для регулярного выражения, которое содержит только один неохотный элемент.

3 голосов
/ 28 марта 2012

Я не уверен насчет реализации Java, но регулярные выражения.info утверждает это для ??:

Делает предыдущий элемент необязательным.Ленивый, поэтому опциональный пункт исключен в матче, если это возможно .Эта конструкция часто исключается из документации из-за ее ограниченного использования.

Таким образом, вы получаете 4 совпадения (3 позиции символов + пустая строка в ent), а необязательный a исключается из каждого изте.

...