Freigeben über


Gruppierungskonstrukte

Aktualisiert: November 2007

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: (?'name').

(?<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: (?'name1-name2').

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 (?i-s: ) die Einstellung, dass Groß-/Kleinschreibung nicht beachtet wird, und deaktiviert den Einzeilenmodus. Weitere Informationen hierzu finden Sie unter Optionen für reguläre Ausdrücke.

(?=subexpression)

(Positive Lookaheadassertion mit einer Breite von Null.) Der Vergleich wird nur dann fortgesetzt, wenn der Teilausdruck rechts von dieser Position übereinstimmt. Beispiel: \w+(?=\d) entspricht einem Wort, gefolgt von einer Ziffer, wobei für die Ziffer keine Übereinstimmung gesucht wird. Dieses Konstrukt wird nicht rückwärts verarbeitet.

(?!subexpression)

(Negative Lookaheadassertion mit einer Breite von Null.) Der Vergleich wird nur dann fortgesetzt, wenn der Teilausdruck rechts von dieser Position nicht übereinstimmt. Beispiel: \b(?!un)\w+\b entspricht Wörtern, die nicht mit un beginnen.

(?<=subexpression)

(Positive Lookbehindassertion mit einer Breite von Null.) Der Vergleich wird nur dann fortgesetzt, wenn der Teilausdruck links von dieser Position übereinstimmt. Beispiel: (?<=19)99 entspricht Instanzen von 99, die auf 19 folgen. Dieses Konstrukt wird nicht rückwärts verarbeitet.

(?<!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)

((?<One>abc)\d+)?(?<Two>xyz)(.*)

1

1 (Standardname)

((?<One>abc)\d+)

2

2 (Standardname)

(.*)

3

One

(?<One>abc)

4

Two

(?<Two>xyz)

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>>"

*/

Siehe auch

Weitere Ressourcen

Sprachelemente für reguläre Ausdrücke