2016-08-01 3 views
3

Я учусь о Java регулярных выражений, и я заметил, следующий оператор:Значение \ 1 * оператор в Java регулярные выражения

\\*1 

У меня трудно понять, что это значит (поиск в сеть не помогла). Например, в чем разница между этими двумя вариантами:

Pattern p1 = Pattern.compile("(a)\\1*"); // option1 
    Pattern p2 = Pattern.compile("(a)"); // option2 

    Matcher m1 = p1.matcher("a"); 
    Matcher m2 = p2.matcher("a"); 

    System.out.println(m1.group(0)); 
    System.out.println(m2.group(0)); 

Результат:

a 
a 

Спасибо!

+1

Это называется обратная ссылка – anubhava

+2

Это обратная ссылка. Быстрый google показывает, что это явно не работает на Java, вам нужно использовать что-то еще: https://stackoverflow.com/questions/18888877/in-java-regular-expression-1-back-reference-is-not -working – KdgDev

+1

@KdgDev Он отлично работает на Java в качестве регулярного выражения, но не в заменяющем выражении. – assylias

ответ

3

\\1 обратная ссылка, соответствующая в этом случае первой группе захвата, которая находится здесь (a).

Таким образом, (a)\\1* эквивалентен (a)a* в данном конкретном случае.

Вот пример, который показывает разницу:

Pattern p1 = Pattern.compile("(a)\\1*"); 
Pattern p2 = Pattern.compile("(a)"); 

Matcher m1 = p1.matcher("aa"); 
Matcher m2 = p2.matcher("aa"); 

m1.find(); 
System.out.println(m1.group()); 
m2.find(); 
System.out.println(m2.group()); 

Выход:

aa 
a 

Как вы можете видеть, когда у вас есть несколько a первое регулярное выражение захватывает все последовательные a время второй - только первый.

+0

Получил это. Благодарю. – Friedman

2

\\1* ищет a еще раз, 0 или более раз. Может быть, легче понять бы этот пример, используя (a)\\1+, который выглядит, по крайней мере, 2 a с:

Pattern p1 = Pattern.compile("(a)\\1+"); 
Matcher m1 = p1.matcher("aaaaabbaaabbba"); 
while (m1.find()) System.out.println(m1.group()); 

выход будет:

AAAAA
ааа

Но последний a не будет соответствовать, потому что он не повторяется.

1

В Perl от 1 до 9 всегда интерпретируются как обратные ссылки; число с обратным слэшем, превышающее 9, рассматривается как обратная ссылка, если существует, по крайней мере, то, что существует много подвыражений, в противном случае оно интерпретируется, если это возможно, как восьмеричный побег. В этом классе восьмеричные выходы всегда должны начинаться с нуля. В этом классе от 1 до 9 всегда интерпретируются как обратные ссылки, и большее число принимается как обратная ссылка, если по крайней мере существует много подвыражений в этой точке регулярного выражения, в противном случае парсер будет отбрасывать цифры до тех пор, пока номер меньше или равно существующему количеству групп или это одна цифра.

От Pattern документов.

Так это выглядит, как p2 хорош только для одного "a" в то время как p1 хорош для любого числа "a" до тех пор, пока существует, по крайней мере один. Звезда X* X, zero or more times. Это называется звездой Клине.

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