2016-08-01 10 views
3

Regexes ich über Java Regexes lerne, und ich bemerkte den folgenden Betreiber:Die Bedeutung von \ 1 * Operator in Java

\\*1 

ich herauszufinden, harte Zeit, was es bedeutet, (Suche in der Web hat nicht geholfen). Zum Beispiel, was ist der Unterschied zwischen diesen beiden Optionen:

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)); 

Ergebnis:

a 
a 

Dank!

+1

Es ist Back-Referenz – anubhava

+2

Es ist eine Rückverweisung. Eine schnelle Google zeigt, dass dies offenbar nicht in Java funktioniert, müssen Sie etwas anderes verwenden: https://stackoverflow.com/questions/18888877/in-java-regular-expression-1-back-reference-is-not -working – KdgDev

+1

@KdgDev Es funktioniert gut in Java als Regex, aber nicht im Ersatzausdruck. – assylias

Antwort

3

\\1 ist die Rückreferenz, die in diesem Fall der ersten Erfassungsgruppe entspricht, die hier (a) ist.

Also (a)\\1* entspricht (a)a* in diesem speziellen Fall. Hier

ist ein Beispiel, das den Unterschied zeigt:

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()); 

Ausgang:

aa 
a 

Wie Sie sehen können, wenn Sie mehrere haben a die ersten regulären Ausdruck erfasst alle die sukzessive a während der zweite fängt nur den ersten ein.

+0

Verstanden. Vielen Dank. – Friedman

2

\\1* sucht wieder nach a, 0 oder öfter. Vielleicht einfacher zu verstehen, dieses Beispiel wäre, (a)\\1+ verwenden, welche für mindestens 2 a s aussieht:

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

der Ausgang sein:

aaaaa
aaa

Aber die letzte a wird nicht übereinstimmen, weil es nicht wiederholt wird.

1

In Perl werden \ 1 bis \ 9 immer als Rückverweise interpretiert; eine Backslash-Escape-Zahl größer als 9 wird als Rückverweis behandelt, wenn mindestens so viele Teilausdrücke existieren, andernfalls wird sie, wenn möglich, als Oktal-Escape interpretiert. In dieser Klasse müssen Oktal-Fluchten immer mit einer Null beginnen. In dieser Klasse werden \ 1 bis \ 9 immer als Rückverweise interpretiert, und eine größere Zahl wird als Rückverweis akzeptiert, wenn zu diesem Zeitpunkt im regulären Ausdruck mindestens so viele Unterausdrücke vorhanden sind. Andernfalls wird der Parser Ziffern bis zur Nummer löschen ist kleiner oder gleich der vorhandenen Anzahl von Gruppen oder es ist eine Ziffer.

Aus der Pattern docs.

So sieht es aus wie p2 für ein "a" nur gut ist, während p1 für eine beliebige Anzahl von "a" gut ist, solange es mindestens eine ist. Der Stern ist X* X, zero or more times. Es heißt Kleene-Stern.