Beispiel: Suchen nach HREFs
Aktualisiert: November 2007
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 das Regex-Objekt in der DumHRefs-Methode verwendet wird, die mehrfach vom 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. In diesem Beispiel werden durch das Metazeichen "\s" alle Leerräume, und durch das Metazeichen "\S" alle sonstigen Zeichen gefunden.
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 DumHRefs-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
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.) Ausführliche Informationen finden Sie den Ausführungen zur Group.Captures-Auflistung.