Gruppierungskonstrukte
Gruppierungskonstrukte grenzen Teilausdrücke eines regulären Ausdrucks ab und zeichnen gewöhnlich Teilzeichenfolgen einer Eingabezeichenfolge auf. In der folgenden Tabelle werden die Gruppierungskonstrukte für reguläre Ausdrücke beschrieben.
Gruppierungskonstrukt | Beschreibung |
---|---|
( subexpression ) |
Zeichnet den übereinstimmenden Teilausdruck auf (oder die nicht aufzeichnende Gruppe; weitere Informationen hierzu finden Sie im Abschnitt über die ExplicitCapture-Option unter Optionen für reguläre Ausdrücke). Aufzeichnungen mit () werden gemäß der Reihenfolge der öffnenden Klammern automatisch nummeriert, beginnend mit 1. Die erste Aufzeichnung, Aufzeichnungselement Nummer 0, ist der Text, dem das gesamte Muster für den regulären Ausdruck entspricht. |
(?< name > subexpression) |
Zeichnet den übereinstimmenden Teilausdruck in einem Gruppennamen oder einem Nummernnamen auf. Die Zeichenfolge für name darf keine Satzzeichen enthalten und nicht mit einer Zahl beginnen. Sie können anstelle von spitzen Klammern einfache Anführungszeichen verwenden. Beispiel: |
(?< name1 - name2 > subexpression) |
(Ausgleichsgruppendefinition.) Löscht die Definition der zuvor definierten Gruppe name2 und speichert in Gruppe name1 das Intervall zwischen der zuvor definierten Gruppe name2 und der aktuellen Gruppe. Wenn keine Gruppe name2 definiert ist, wird die Übereinstimmung rückwärts verarbeitet. Da durch Löschen der letzten Definition von name2 die vorherige Definition von name2 angezeigt wird, kann mithilfe dieses Konstrukts der Aufzeichnungsstapel für die Gruppe name2 als Zähler für die Aufzeichnung von geschachtelten Konstrukten, z. B. Klammern, verwendet werden. In diesem Konstrukt ist name1 optional. Sie können anstelle von spitzen Klammern einfache Anführungszeichen verwenden. Beispiel: Weitere Informationen finden Sie im Beispiel in diesem Thema. |
(?: subexpression) |
(Nicht aufzeichnende Gruppe.) Zeichnet nicht die Teilzeichenfolge auf, der der Teilausdruck entspricht. |
(?imnsx-imnsx: subexpression) |
Aktiviert oder deaktiviert die angegebenen Optionen innerhalb des Teilausdrucks. Beispielsweise aktiviert |
(?= subexpression) |
(Positive Lookaheadassertion mit einer Breite von Null.) Der Vergleich wird nur dann fortgesetzt, wenn der Teilausdruck rechts von dieser Position übereinstimmt. Beispiel: |
(?! subexpression) |
(Negative Lookaheadassertion mit einer Breite von Null.) Der Vergleich wird nur dann fortgesetzt, wenn der Teilausdruck rechts von dieser Position nicht übereinstimmt. Beispiel: |
(?<= subexpression) |
(Positive Lookbehindassertion mit einer Breite von Null.) Der Vergleich wird nur dann fortgesetzt, wenn der Teilausdruck links von dieser Position übereinstimmt. Beispiel: |
(?<! subexpression) |
(Negative Lookbehindassertion mit einer Breite von Null.) Der Vergleich wird nur dann fortgesetzt, wenn der Teilausdruck links von dieser Position nicht übereinstimmt. |
(?> subexpression) |
(Nicht zurückverfolgende Teilausdrücke (so genannte "gierige" Teilausdrücke).) Für den Teilausdruck wird einmal eine volle Übereinstimmung gesucht, dann wird der Teilausdruck nicht stückweise in der Rückwärtsverarbeitung einbezogen. (D. h. der Teilausdruck entspricht nur Zeichenfolgen, für die durch den Teilausdruck allein eine Übereinstimmung gesucht werden würde.) Falls keine Übereinstimmung gefunden werden kann, wird bei der Rückverfolgung standardmäßig nach anderen möglichen Übereinstimmungen gesucht. Wenn Sie wissen, dass die Rückverfolgung nicht erfolgreich verlaufen kann, können Sie einen nicht zurückverfolgenden Teilausdruck verwenden, um unnötige Suchvorgänge zu vermeiden und so die Leistung zu verbessern. |
Benannte Aufzeichnungen werden fortlaufend nummeriert, und zwar gemäß der Reihenfolge der öffnenden Klammern von links nach rechts (wie bei unbenannten Aufzeichnungen). Die Nummerierung von benannten Aufzeichnungen beginnt jedoch erst, nachdem alle unbenannten Aufzeichnungen gezählt wurden. Beispiel: Das Muster ((?<One>abc)/d+)?(?<Two>xyz)(.*)
generiert die folgenden Aufzeichnungsgruppen nach Nummer und Name. (Die erste Aufzeichnung [Nummer 0] bezieht sich stets auf das gesamte Muster).
Nummer | Name | Muster |
---|---|---|
0 |
0 (Standardname) |
|
1 |
1 (Standardname) |
|
2 |
2 (Standardname) |
|
3 |
One |
|
4 |
Two |
|
Ausgleichsgruppendefinition – Beispiel
Das folgende Codebeispiel veranschaulicht die Verwendung einer Ausgleichsgruppendefinition, um in einer Eingabezeichenfolge nach öffnenden und schließenden spitzen Klammern (<>) zu suchen. Die Aufzeichnungsauflistungen der Open-Gruppe und der Close-Gruppe im Beispiel werden wie ein Stapel verwendet, um zueinander passende Paare von spitzen Klammern zu verfolgen: Jede aufgezeichnete öffnende spitze Klammer wird in die Aufzeichnungsauflistung der Open-Gruppe verschoben, und jede schließende spitze Klammer wird in die Aufzeichnungsauflistung der Close-Gruppe verschoben. Die Ausgleichsgruppendefinition stellt dabei sicher, dass für jede öffnende spitze Klammer eine schließende spitze Klammer vorhanden ist.
' This code example demonstrates using the balancing group definition feature of
' regular expressions to match balanced left angle bracket (<) and right angle
' bracket (>) characters in a string.
Imports System
Imports System.Text.RegularExpressions
Class Sample
Public Shared Sub Main()
'
' The following expression matches all balanced left and right angle brackets(<>).
' The expression:
' 1) Matches and discards zero or more non-angle bracket characters.
' 2) Matches zero or more of:
' 2a) One or more of:
' 2a1) A group named "Open" that matches a left angle bracket, followed by zero
' or more non-angle bracket characters.
' "Open" essentially counts the number of left angle brackets.
' 2b) One or more of:
' 2b1) A balancing group named "Close" that matches a right angle bracket,
' followed by zero or more non-angle bracket characters.
' "Close" essentially counts the number of right angle brackets.
' 3) If the "Open" group contains an unaccounted for left angle bracket, the
' entire regular expression fails.
'
Dim pattern As String = "^[^<>]*" & _
"(" + "((?'Open'<)[^<>]*)+" & _
"((?'Close-Open'>)[^<>]*)+" + ")*" & _
"(?(Open)(?!))$"
Dim input As String = "<abc><mno<xyz>>"
'
Dim m As Match = Regex.Match(input, pattern)
If m.Success = True Then
Console.WriteLine("Input: ""{0}"" " & vbCrLf & "Match: ""{1}""", _
input, m)
Else
Console.WriteLine("Match failed.")
End If
End Sub 'Main
End Class 'Sample
'This code example produces the following results:
'
'Input: "<abc><mno<xyz>>"
'Match: "<abc><mno<xyz>>"
'
// This code example demonstrates using the balancing group definition feature of
// regular expressions to match balanced left angle bracket (<) and right angle
// bracket (>) characters in a string.
using System;
using System.Text.RegularExpressions;
class Sample
{
public static void Main()
{
/*
The following expression matches all balanced left and right angle brackets(<>).
The expression:
1) Matches and discards zero or more non-angle bracket characters.
2) Matches zero or more of:
2a) One or more of:
2a1) A group named "Open" that matches a left angle bracket, followed by zero
or more non-angle bracket characters.
"Open" essentially counts the number of left angle brackets.
2b) One or more of:
2b1) A balancing group named "Close" that matches a right angle bracket,
followed by zero or more non-angle bracket characters.
"Close" essentially counts the number of right angle brackets.
3) If the "Open" group contains an unaccounted for left angle bracket, the
entire regular expression fails.
*/
string pattern = "^[^<>]*" +
"(" +
"((?'Open'<)[^<>]*)+" +
"((?'Close-Open'>)[^<>]*)+" +
")*" +
"(?(Open)(?!))$";
string input = "<abc><mno<xyz>>";
//
Match m = Regex.Match(input, pattern);
if (m.Success == true)
Console.WriteLine("Input: \"{0}\" \nMatch: \"{1}\"", input, m);
else
Console.WriteLine("Match failed.");
}
}
/*
This code example produces the following results:
Input: "<abc><mno<xyz>>"
Match: "<abc><mno<xyz>>"
*/