Freigeben über


Beispiel: Suchen nach HREFs

Im folgenden Beispiel wird eine Eingabezeichenfolge durchsucht, und die Werte aller Vorkommnisse von href="…" sowie ihre Position innerhalb der Zeichenfolge werden ausgegeben. Dazu wird ein kompiliertes Regex-Objekt erstellt. Anschließend wird die Suchabfrage mit einem Match-Objekt über die gesamte Zeichenfolge wiederholt.

In diesem Beispiel werden durch das Metazeichen "\s" alle Leerräume, und durch das Metazeichen "\S" alle sonstigen Zeichen gefunden.

    Sub DumpHrefs(inputString As String)
        Dim r As Regex
        Dim m As Match
    
        r = New Regex("href\s*=\s*(?:""(?<1>[^""]*)""|(?<1>\S+))", _
            RegexOptions.IgnoreCase Or RegexOptions.Compiled)
    
        m = r.Match(inputString)
        While m.Success
            Console.WriteLine("Found href " & m.Groups(1).Value _
                & " at " & m.Groups(1).Index.ToString())
            m = m.NextMatch()
        End While
    End Sub
    void DumpHrefs(String inputString) 
    {
        Regex r;
        Match m;

        r = new Regex("href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))",
            RegexOptions.IgnoreCase|RegexOptions.Compiled);
        for (m = r.Match(inputString); m.Success; m = m.NextMatch()) 
        {
            Console.WriteLine("Found href " + m.Groups[1] + " at " 
                + m.Groups[1].Index);
        }
    }

Kompiliertes Muster

In diesem Codebeispiel wird vor Eintritt in die Suchschleife ein Regex-Objekt erzeugt, um das kompilierte Muster zu speichern. Da die Syntaxanalyse, Optimierung und Kompilierung eines regulären Ausdrucks gewisse Zeit in Anspruch nimmt, werden diese Aufgaben außerhalb der Schleife ausgeführt, um Wiederholung zu vermeiden.

Instanzen einer Regex-Klasse sind unveränderbar; jede einzelne Instanz entspricht einem einzigen Suchmuster und ist ohne Status. Dadurch können einzelne Regex-Instanzen von mehreren Funktionen oder auch von unterschiedlichen Threads gemeinsam verwendet werden.

Suchergebnisklasse

Die Ergebnisse einer Suche werden in der Match-Klasse gespeichert, die alle von der Suche extrahierten Teilzeichenfolgen zugänglich macht. Auch die durchsuchte Zeichenfolge und der verwendete reguläre Ausdruck werden gespeichert, sodass weitere Suchdurchläufe dort starten können, wo der letzte beendet wurde.

Explizit benannte Aufzeichnungen

In herkömmlichen regulären Ausdrücken werden umschließende Klammern automatisch nach der Reihenfolge durchnummeriert. Daraus ergeben sich zwei Probleme: Zum einen muss nach dem Hinzufügen oder Entfernen von Klammern der gesamte Code, der sich auf die numerierten Klammern bezieht, gemäß der neuen Numerierung verändert werden. Zweitens werden häufig unterschiedliche Klammerpaare verwendet, um zwei Alternativausdrücke für eine Übereinstimmung zu erhalten. Dadurch wird es schwierig festzustellen, durch welchen der beiden Ausdrücke das Ergebnis zurückgegeben wurde.

Um diesen Schwierigkeiten zu begegnen, unterstützt Regex die Syntax (?<name>…) zur Speicherung einer Zeichenfolge in einem festgelegten Slot. (Der Slot kann mit Zeichenfolgen oder ganzen Zahlen benannt werden; ganze Zahlen können schneller aufgerufen werden.) Damit können alle Suchergebnisse für dieselbe Zeichenfolge am gleichen Ort abgelegt werden. Im Fall eines Konflikts ist das zuletzt im Slot gespeicherte Suchergebnis gültig. (Eine vollständige Liste von mehrfachen Übereinstimmungen für einen einzelnen Slot steht jedoch zur Verfügung.) Weitere Informationen finden Sie in der Group.Captures-Auflistung.)

Siehe auch

Weitere Ressourcen

Reguläre Ausdrücke von .NET Framework