Porady: wyodrębnianie protokółu i numeru portu z adresu URL

Poniższy przykład wyodrębnia protokół i numer portu z adresu URL.

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 , RegularExpressionspowodując atak typu "odmowa usługi". ASP.NET podstawowe interfejsy API platformy, które używają RegularExpressions przekroczenia limitu czasu.

Przykład

W przykładzie użyto Match.Result metody , aby zwrócić protokół, po którym następuje dwukropek, po którym następuje numer portu.

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string url = "http://www.contoso.com:8080/letters/readme.html";

      Regex r = new Regex(@"^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/",
                          RegexOptions.None, TimeSpan.FromMilliseconds(150));
      Match m = r.Match(url);
      if (m.Success)
         Console.WriteLine(m.Result("${proto}${port}"));
   }
}
// The example displays the following output:
//       http:8080
Imports System.Text.RegularExpressions

Module Example
    Public Sub Main()
        Dim url As String = "http://www.contoso.com:8080/letters/readme.html"
        Dim r As New Regex("^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/",
                           RegexOptions.None, TimeSpan.FromMilliseconds(150))

        Dim m As Match = r.Match(url)
        If m.Success Then
            Console.WriteLine(m.Result("${proto}${port}"))
        End If
    End Sub
End Module
' The example displays the following output:
'       http:8080

Wzorzec ^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/ wyrażenia regularnego można interpretować, jak pokazano w poniższej tabeli.

Wzorzec opis
^ Rozpocznij dopasowanie na początku ciągu.
(?<proto>\w+) Dopasowuje co najmniej jeden znak słowa. Nadaj tej grupie protonazwę .
:// Dopasuj dwukropek, a następnie dwa znaki ukośnika.
[^/]+? Dopasuj co najmniej jedno wystąpienie (ale jak najmniej) dowolnego znaku innego niż znak ukośnika.
(?<port>:\d+)? Dopasuj zero lub jedno wystąpienie dwukropka, po którym następuje co najmniej jeden znak cyfry. Nadaj tej grupie portnazwę .
/ Dopasuj znak ukośnika.

Metoda Match.Result rozszerza ${proto}${port} sekwencję zastępczą, która łączy wartość dwóch nazwanych grup przechwyconych we wzorcu wyrażenia regularnego. Jest to wygodna alternatywa dla jawnego łączenia ciągów pobranych z obiektu kolekcji zwróconego Match.Groups przez właściwość .

W przykładzie użyto Match.Result metody z dwoma podstawieniami i ${proto}${port}, aby uwzględnić przechwycone grupy w ciągu wyjściowym. Zamiast tego można pobrać przechwycone grupy z obiektu match, GroupCollection jak pokazano w poniższym kodzie.

Console.WriteLine(m.Groups["proto"].Value + m.Groups["port"].Value);
Console.WriteLine(m.Groups("proto").Value + m.Groups("port").Value)

Zobacz też