Регулярное выражение: притяжательный квантификатор для оператора повторения звезды, т. е. \d**

Из Справочного руководства GLib, раздел Синтаксис регулярных выражений, подраздел Атомная группировка и притяжательные квантификаторы:

Рассмотрим шаблон \d+foo применительно к строке 123456bar: после сопоставления всех 6 цифр и неудачного совпадения с foo нормальным действием сопоставителя является повторная попытка только с 5 цифрами, соответствующими элементу \d+, а затем с 4, и так далее. на, прежде чем в конечном итоге потерпит неудачу.

Если мы используем (?>\d+)foo (называемую атомарной группировкой) для предыдущего примера, сопоставитель немедленно сдается, если не может сопоставить foo в первый раз.

Когда подшаблон для атомарной группы представляет собой всего один повторяющийся элемент, как в приведенном выше примере, можно использовать более простую запись, называемую притяжательным квантором: \d++foo

Мой вопрос: есть ли причина, по которой нет эквивалента для оператора повторения звезды (*)?

Пример на Java:

final String in = "123456";
// "plus" (+)
System.out.println(in.matches("\\d+"));     // true
System.out.println(in.matches("(?>\\d+)")); // true
System.out.println(in.matches("\\d++"));    // true
// "star" (*)
System.out.println(in.matches("\\d*"));     // true
System.out.println(in.matches("(?>\\d*)")); // true
System.out.println(in.matches("\\d**"));    // exception

Трассировка стека исключений:

Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 3
\d**
   ^
    at java.util.regex.Pattern.error(Pattern.java:1713)
    at java.util.regex.Pattern.sequence(Pattern.java:1878)
    at java.util.regex.Pattern.expr(Pattern.java:1752)
    at java.util.regex.Pattern.compile(Pattern.java:1460)
    at java.util.regex.Pattern.<init>(Pattern.java:1133)
    at java.util.regex.Pattern.compile(Pattern.java:823)
    at java.util.regex.Pattern.matches(Pattern.java:928)
    at java.lang.String.matches(String.java:2090)

person sp00m    schedule 24.04.2013    source источник
comment
вы имеете в виду оператор star вместо start? \d* здесь * соответствует \d, тогда у вас есть еще *, который ничему не соответствует. Если вы сделаете .*, то он будет соответствовать любому символу любое количество раз (если я правильно помню, . соответствует всем, кроме \n, и может быть несколько других вещей).   -  person Bill    schedule 24.04.2013


Ответы (1)


Вы можете добавить + к чему угодно, чтобы получить притяжательный квантификатор (это не «удвоение квантификатора»). Так

System.out.println(in.matches("\\d*+"));
person Loamhoof    schedule 24.04.2013
comment
О, я не смотрел на это с этой стороны... Спасибо :) - person sp00m; 24.04.2013