Przykład wyrażenia regularnego: skanowanie pod kątem hrEFs
Poniższy przykład wyszukuje ciąg wejściowy i wyświetla wszystkie elementy href="..." wartości i ich lokalizacje w ciągu.
Ostrzeżenie
W przypadku używania System.Text.RegularExpressions metody do przetwarzania niezaufanych danych wejściowych należy przekazać limit czasu. Złośliwy użytkownik może przekazać dane wejściowe , RegularExpressions
powodując atak typu "odmowa usługi". ASP.NET podstawowe interfejsy API platformy, które używają RegularExpressions
przekroczenia limitu czasu.
Obiekt Regex
DumpHRefs
Ponieważ metoda może być wywoływana wiele razy z kodu użytkownika, używa static
metody (Shared
w Visual Basic). Regex.Match(String, String, RegexOptions) Umożliwia to aparatowi wyrażeń regularnych buforowanie wyrażenia regularnego i pozwala uniknąć narzutu na utworzenie wystąpienia nowego Regex obiektu za każdym razem, gdy metoda jest wywoływana. Następnie Match obiekt jest używany do iterowania wszystkich dopasowań w ciągu.
private static void DumpHRefs(string inputString)
{
string hrefPattern = @"href\s*=\s*(?:[""'](?<1>[^""']*)[""']|(?<1>[^>\s]+))";
try
{
Match regexMatch = Regex.Match(inputString, hrefPattern,
RegexOptions.IgnoreCase | RegexOptions.Compiled,
TimeSpan.FromSeconds(1));
while (regexMatch.Success)
{
Console.WriteLine($"Found href {regexMatch.Groups[1]} at {regexMatch.Groups[1].Index}");
regexMatch = regexMatch.NextMatch();
}
}
catch (RegexMatchTimeoutException)
{
Console.WriteLine("The matching operation timed out.");
}
}
Private Sub DumpHRefs(inputString As String)
Dim hrefPattern As String = "href\s*=\s*(?:[""'](?<1>[^""']*)[""']|(?<1>[^>\s]+))"
Try
Dim regexMatch = Regex.Match(inputString, hrefPattern,
RegexOptions.IgnoreCase Or RegexOptions.Compiled,
TimeSpan.FromSeconds(1))
Do While regexMatch.Success
Console.WriteLine($"Found href {regexMatch.Groups(1)} at {regexMatch.Groups(1).Index}.")
regexMatch = regexMatch.NextMatch()
Loop
Catch e As RegexMatchTimeoutException
Console.WriteLine("The matching operation timed out.")
End Try
End Sub
Poniższy przykład ilustruje wywołanie DumpHRefs
metody .
public static void Main()
{
string inputString = "My favorite web sites include:</P>" +
"<A HREF=\"https://learn.microsoft.com/en-us/dotnet/\">" +
".NET Documentation</A></P>" +
"<A HREF=\"http://www.microsoft.com\">" +
"Microsoft Corporation Home Page</A></P>" +
"<A HREF=\"https://devblogs.microsoft.com/dotnet/\">" +
".NET Blog</A></P>";
DumpHRefs(inputString);
}
// The example displays the following output:
// Found href https://learn.microsoft.com/dotnet/ at 43
// Found href http://www.microsoft.com at 114
// Found href https://devblogs.microsoft.com/dotnet/ at 188
Public Sub Main()
Dim inputString As String = "My favorite web sites include:</P>" &
"<A HREF=""https://learn.microsoft.com/en-us/dotnet/"">" &
".NET Documentation</A></P>" &
"<A HREF=""http://www.microsoft.com"">" &
"Microsoft Corporation Home Page</A></P>" &
"<A HREF=""https://devblogs.microsoft.com/dotnet/"">" &
".NET Blog</A></P>"
DumpHRefs(inputString)
End Sub
' The example displays the following output:
' Found href https://learn.microsoft.com/dotnet/ at 43
' Found href http://www.microsoft.com at 114
' Found href https://devblogs.microsoft.com/dotnet/ at 188
Wzorzec href\s*=\s*(?:["'](?<1>[^"']*)["']|(?<1>[^>\s]+))
wyrażenia regularnego jest interpretowany, jak pokazano w poniższej tabeli.
Wzorzec | opis |
---|---|
href |
Dopasuj ciąg literału "href". Dopasowanie jest bez uwzględniania wielkości liter. |
\s* |
Dopasowanie do zera lub większej liczby znaków odstępu. |
= |
Dopasuj znak równości. |
\s* |
Dopasowanie do zera lub większej liczby znaków odstępu. |
(?: |
Uruchom nieuchwytną grupę. |
["'](?<1>[^"']*)["'] |
Dopasuj cudzysłów lub apostrof, a następnie grupę przechwytywania zgodną z dowolnym znakiem cudzysłowu lub apostrofem, a następnie znakiem cudzysłowu lub apostrofem. Grupa o nazwie 1 jest uwzględniona w tym wzorcu. |
| | Wartość logiczna OR zgodna z poprzednim wyrażeniem lub następnym wyrażeniem. |
(?<1>[^>\s]+) |
Grupa przechwytywania, która używa negowanego zestawu, aby dopasować dowolny znak inny niż znak większy niż znak lub znak odstępu. Grupa o nazwie 1 jest uwzględniona w tym wzorcu. |
) |
Zakończ grupę nieuchwytną. |
Dopasuj klasę wyników
Wyniki wyszukiwania są przechowywane w Match klasie, która zapewnia dostęp do wszystkich podciągów wyodrębnionych przez wyszukiwanie. Zapamiętuje również wyszukiwany ciąg i używane wyrażenie regularne, dzięki czemu może wywołać Match.NextMatch metodę w celu wykonania innego wyszukiwania, zaczynając od ostatniego zakończonego.
Jawnie nazwane przechwytywanie
W tradycyjnych wyrażeniach regularnych przechwytywanie nawiasów jest automatycznie numerowane sekwencyjnie. Prowadzi to do dwóch problemów. Po pierwsze, jeśli wyrażenie regularne jest modyfikowane przez wstawianie lub usuwanie zestawu nawiasów, cały kod odwołujący się do numerowanych przechwytywania musi zostać przepisany, aby odzwierciedlić nową numerowanie. Po drugie, ponieważ różne zestawy nawiasów często są używane do udostępniania dwóch alternatywnych wyrażeń dla akceptowalnego dopasowania, może być trudno określić, które z dwóch wyrażeń faktycznie zwróciły wynik.
Aby rozwiązać te problemy, Regex klasa obsługuje składnię (?<name>…)
przechwytywania dopasowania do określonego miejsca (miejsce może być nazwane przy użyciu ciągu lub liczby całkowitej; liczby całkowite mogą być przywoływane szybciej). W związku z tym alternatywne dopasowania dla tego samego ciągu mogą być kierowane do tego samego miejsca. W przypadku konfliktu ostatni mecz porzucony w miejscu jest pomyślnym dopasowaniem. (Dostępna jest jednak pełna lista wielu dopasowań dla jednego miejsca. Group.Captures Zobacz kolekcję, aby uzyskać szczegółowe informacje).