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*1
oder 1*0
, dann $
) gegen ^0*1|1*0$
( ^0*1
oder1*0$
).
Eine Erfassungsgruppe zeichnet neben der Gruppierung auch den Text auf, der mit dem Muster innerhalb der Erfassungsgruppe übereinstimmt (pattern)
. Mit Ihrem Beispiel (.*):
, .*
Spiele ABC
und :
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 \n
im Muster und $n
als 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.