RegexGruppen
Last changed: Alexander Zeitler

Summary: Man möchte oft mehrere Zeichen in einem Ausdruck zusammengefasst haben um sie gemeinsam zu testen. Hier diskutieren wir die Möglichkeiten die wir dafür haben.
Index: RegularExpressions

Gruppierung in Regexen

Die einfachste Gruppierung verwendet () zur Zusammenfassung. Im Gegensatz zu den [] der Zeichenklassen muss der Inhalt der Klammern genau getroffen werden:

(Abc) trifft genau auf 'Abc' zu, [Abc] trifft auf 'A', 'b' oder 'c' zu, nicht aber auf 'Abc'!

Die Ergebnisse einer Gruppe können über Nummern angesprochen werden, wobei die Nummerierung mit der äussersten linken Klammer beginnt. Gruppen können auch verschachtelt werden. Beispiele für die Zählung:

(1)(2)(3) - ohne Schachtelung

(1(2))(3) - mit Schachtelung

Die Gruppen werden mit Match.Groups(nn) angesprochen, wobei nn die Nummer der Gruppe ist. Praktischer allerdings ist es, die Gruppen zu benennen, da man so gerade bei komplizierten Ausdrücken (welche Regex ist nicht kompliziert?) leichter den Überblick bewahren kann. Die Benennung erfolgt so:

(?<name>gruppeninhalt) bzw. (?'name'gruppeninhalt)

Die Namen dürfen keine Satzzeichen enthalten und auch nicht mit einer Ziffer beginnen. Benannte und unbenannte Gruppen können gemischt verwendet werden. Die Nummerierung beginnt mit den unbenannten Gruppen. Erst dann werden Nummern für die benannten Gruppen vergeben.

Natürlich gibt es noch mehr Möglichkeiten:

(?<namejetzt-namevorher>gruppeninhalt) bzw. (?'namejetzt-namevorher'gruppeninhalt)

Dient dazu, die Definition der Gruppe namevorher zu löschen und durch namejetzt zu ersetzen. Der Text zwischen den beiden Definitionen wird gespeichert. Ist namevorher nicht definiert wird 'Backtracking' ausgelöst. Dabei wird nach dem Löschen der letzten Gruppe namevorher ein Stack hochgezählt, so daß man auf diese Weise z.B. Klammern zählen und balancieren kann. Leicht verwirrend, aber praktisch.

Wenn man den Gruppeninhalt nicht für weitere Behandlung behalten will, schreibt man die Gruppe wie folgt an:

(?:gruppeninhalt)

Man kann auch spezifische RegexOptionen innerhalb einer Gruppe aktivieren oder deaktivieren:

(?imnsx-imnsx: )

'imnsx' sind dabei die auf der entsprechenden Seite erklärten RegexOptionen. Vor dem '-' stehende Optionen werden aktiviert, die dahinter stehenden deaktiviert.