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.
Das Regex-Objekt
Da die DumpHRefs-Methode mehrfach im Benutzercode aufgerufen werden kann, wird die static (Shared in Visual Basic) Regex.Match(String, String, RegexOptions)-Methode verwendet. Dies ermöglich dem Modul für reguläre Ausdrücke, den regulären Ausdruck zwischenzuspeichern, und vermeidet den zusätzlichen Aufwand, jedesmal ein neues Regex-Objekt zu instanziieren, wenn die Methode aufgerufen wird. Ein Match-Objekt wird dann verwendet, um alle Übereinstimmungen in der Zeichenfolge zu durchlaufen.
Private Sub DumpHRefs(inputString As String)
Dim m As Match
Dim HRefPattern As String = "href\s*=\s*(?:""(?<1>[^""]*)""|(?<1>\S+))"
m = Regex.Match(inputString, HRefPattern, _
RegexOptions.IgnoreCase Or RegexOptions.Compiled)
Do While m.Success
Console.WriteLine("Found href {0} at {1}.", _
m.Groups(1), m.Groups(1).Index)
m = m.NextMatch()
Loop
End Sub
private static void DumpHRefs(string inputString)
{
Match m;
string HRefPattern = "href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))";
m = Regex.Match(inputString, HRefPattern,
RegexOptions.IgnoreCase | RegexOptions.Compiled);
while (m.Success)
{
Console.WriteLine("Found href " + m.Groups[1] + " at "
+ m.Groups[1].Index);
m = m.NextMatch();
}
}
Im folgenden Beispiel wird der Aufruf der DumpHRefs-Methode veranschaulicht.
Public Sub Main()
Dim inputString As String = "My favorite web sites include:</P>" & _
"<A HREF=""https://msdn2.microsoft.com"">" & _
"MSDN Home Page</A></P>" & _
"<A HREF=""https://www.microsoft.com"">" & _
"Microsoft Corporation Home Page</A></P>" & _
"<A HREF=""https://blogs.msdn.com/bclteam"">" & _
".NET Base Class Library blog</A></P>"
DumpHRefs(inputString)
End Sub
' The example displays the following output:
' Found href https://msdn2.microsoft.com at 43
' Found href https://www.microsoft.com at 102
' Found href https://blogs.msdn.com/bclteam/) at 176
public static void Main()
{
string inputString = "My favorite web sites include:</P>" +
"<A HREF=\"https://msdn2.microsoft.com\">" +
"MSDN Home Page</A></P>" +
"<A HREF=\"https://www.microsoft.com\">" +
"Microsoft Corporation Home Page</A></P>" +
"<A HREF=\"https://blogs.msdn.com/bclteam\">" +
".NET Base Class Library blog</A></P>";
DumpHRefs(inputString);
}
// The example displays the following output:
// Found href https://msdn2.microsoft.com at 43
// Found href https://www.microsoft.com at 102
// Found href https://blogs.msdn.com/bclteam at 176
Das Muster für reguläre Ausdrücke href\s*=\s*(?:"(?<1>[^""]*)"|(?<1>\S+)) wird entsprechend der folgenden Tabelle interpretiert.
Muster |
Beschreibung |
---|---|
href |
Sucht nach der Literalzeichenfolge "href". Die Groß- und Kleinschreibung wird bei der Übereinstimmung nicht berücksichtigt. |
\s* |
Sucht nach 0 (null) oder mehr Leerzeichen. |
= |
Sucht nach dem Gleichheitszeichen. |
\s* |
Sucht nach 0 (null) oder mehr Leerzeichen. |
(?:"(?<1>[^""]*)"|(?<1>\S+)) |
Sucht nach einer der folgenden Zeichenkombinationen, ohne das Ergebnis einer erfassten Gruppe zuzuweisen:
|
(?<1>[^"]*) |
Weist 0 (null) oder mehr Vorkommen eines beliebigen Zeichens, das kein Anführungszeichen ist, der Erfassungsgruppe mit dem Namen 1 zu. |
"(?<1>\S+) |
Weist ein oder mehr Nicht-Leerzeichen der Erfassungsgruppe mit dem Namen 1 zu. |
Suchergebnisklasse
Die Ergebnisse einer Suche werden in der Match-Klasse gespeichert, die Zugriff auf alle von der Suche extrahierten Teilzeichenfolgen bietet. Die durchsuchte Zeichenfolge und der verwendete reguläre Ausdruck werden ebenfalls gespeichert, sodass die Match.NextMatch-Methode aufgerufen werden kann, um einen weiteren Suchvorgang ab der Stelle auszuführen, an der der letzte Suchvorgang 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 die Regex-Klasse die (?<name>…)-Syntax 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.) Ausführliche Informationen finden Sie den Ausführungen zur Group.Captures-Auflistung.