Поделиться через


Практическое руководство. Извлечение протокола и номера порта из URL-адреса

В следующем примере выполняется извлечение протокола и номера порта из URL-адреса.

Предупреждение

При использовании System.Text.RegularExpressions для обработки ненадежных входных данных передайте время ожидания. Злоумышленник может предоставить входные данные RegularExpressions, вызывая атаку типа "отказ в обслуживании". API платформы ASP.NET Core, использующие RegularExpressions, передают время ожидания.

Пример

Этот пример использует метод Match.Result, чтобы вернуть имя протокола и номер порта, разделенные двоеточием.

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

Возможные интерпретации шаблона регулярного выражения ^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/ показаны в следующей таблице.

Расписание Description
^ Соответствие должно обнаруживаться в начале строки.
(?<proto>\w+) Совпадение с одним или несколькими символами слова. Присвойте этой группе имя proto.
:// Совпадение с двоеточием, за которым следуют две косые черты.
[^/]+? Совпадение с одним или несколькими вхождениями (но как можно меньшему числу) любого символа, отличного от косой черты.
(?<port>:\d+)? Совпадение с вхождениями в количестве 0 или 1 двоеточия, за которым следует одна или несколько цифр. Присвойте этой группе имя port.
/ Совпадение с косой чертой.

Метод Match.Result разворачивает последовательность замены ${proto}${port}, которая объединяет захваченное значение из двух именованных групп в шаблоне регулярного выражения. Это удобная альтернатива явному объединению строк, извлеченных из объекта коллекции, который был возвращен свойством Match.Groups.

В примере используется метод Match.Result с двумя подстановками ${proto} и ${port} для включения захваченных групп в выходную строку. Вместо этого вы можете извлечь захваченные группы из объекта GroupCollection в сопоставлении, как показано в следующем примере кода.

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

См. также