Erfassen und Gruppieren
Erfassungsgruppe (pattern) erstellt eine Gruppe mit Erfassungseigenschaft .
Eine verwandte, die Sie häufig sehen (und verwenden), ist die (?:pattern), die eine Gruppe erstellt, ohne die Eigenschaft zu erfassen , daher benannt nicht erfassende Gruppe bezeichnet wird .
Eine Gruppe wird normalerweise verwendet, wenn Sie eine Folge von Mustern wiederholen müssen, z. B. (\.\w+)+oder um anzugeben, wo die Abwechslung wirksam werden soll, z. B. ^(0*1|1*0)$( ^, dann 0*1oder 1*0, dann $) gegen ^0*1|1*0$( ^0*1oder1*0$ ).
Eine Erfassungsgruppe zeichnet neben der Gruppierung auch den Text auf, der mit dem Muster innerhalb der Erfassungsgruppe übereinstimmt (pattern). Mit Ihrem Beispiel (.*):, .*Spiele ABCund :Matches :, und da .*ist innerhalb Erfassung Gruppe (.*), der TextABC für die Erfassungsgruppe 1 aufgezeichnet.
Gruppennummer
Das gesamte Muster ist definiert Gruppennummer 0 sein.
Jede Erfassungsgruppe im Muster beginnt mit der Indizierung ab 1. Die Indizes werden durch die Reihenfolge der öffnenden Klammern der Erfassungsgruppen definiert . Als Beispiel sind hier alle 5 Erfassungsgruppen im folgenden Muster aufgeführt:
(group)(?:non-capturing-group)(g(?:ro|u)p( (nested)inside)(another)group)(?=assertion)
| | | | | | || | |
1-----1 | | 4------4 |5-------5 |
| 3---------------3 |
2-----------------------------------------2
Die Gruppennummern werden als Rückverweis \nim Muster und $nals Ersatzzeichenfolge verwendet.
In anderen Regex-Varianten (PCRE, Perl) können sie auch in Subroutinenaufrufen verwendet werden .
Sie können auf den Text zugreifen, mit dem eine bestimmte Gruppe übereinstimmt Matcher.group(int group). Die Gruppennummern können mit der oben angegebenen Regel identifiziert werden.
In einigen Regex-Varianten (PCRE, Perl) gibt es eine Funktion zum Zurücksetzen von Zweigen , mit der Sie dieselbe Nummer zum Erfassen von Gruppen in verschiedenen Zweigen des Wechsels verwenden können .
Gruppenname
In Java 7 können Sie eine benannte Erfassungsgruppe definieren (?<name>pattern) und auf den Inhalt zugreifen, der mit übereinstimmt Matcher.group(String name). Der reguläre Ausdruck ist länger, aber der Code ist aussagekräftiger, da er angibt, was Sie mit dem regulären Ausdruck abgleichen oder extrahieren möchten.
Die Gruppennamen werden in der Rückreferenz \k<name>in Muster und verwendet${name} in der Ersatzzeichenfolge verwendet.
Benannt einfangenden Gruppen sind immer noch mit der gleichen Nummerierungsschema nummeriert, so können sie auch über zugegriffen werden Matcher.group(int group).
Intern ordnet die Java-Implementierung nur den Namen der Gruppennummer zu. Daher können Sie nicht denselben Namen für zwei verschiedene Erfassungsgruppen verwenden.