Como: extrair um protocolo e um número da porta de uma URL

O exemplo a seguir extrai um protocolo e um número da porta de uma URL.

Aviso

Ao usar System.Text.RegularExpressions para processar entradas não confiáveis, passe um tempo limite. Um usuário mal-intencionado pode fornecer entrada para RegularExpressions, causando um ataque de negação de serviço. APIs ASP.NET Core Framework que usam RegularExpressions passam um tempo limite.

Exemplo

O exemplo usa o método Match.Result para retornar o protocolo seguido por dois-pontos e pelo número da porta.

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

O padrão de expressão regular ^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/ pode ser interpretado conforme mostrado na tabela a seguir.

Padrão Descrição
^ Comece a correspondência no início da cadeia de caracteres.
(?<proto>\w+) Fazer a correspondência a um ou mais caracteres de palavra. Nomeie esse grupo como proto.
:// Fazer a correspondência de um sinal de dois-pontos seguido por duas barras "/".
[^/]+? Fazer a correspondência de uma ou mais ocorrências (mas o menor número possível) de qualquer caractere que não seja uma barra "/".
(?<port>:\d+)? Fazer a correspondência de zero ou uma ocorrência de um sinal de dois-pontos seguido por um ou mais caracteres de dígito. Nomeie esse grupo como port.
/ Fazer a correspondência de uma barra "/".

O método Match.Result expande a sequência de substituição ${proto}${port}, que concatena o valor dos dois grupos nomeados capturados no padrão de expressão regular. Essa é uma alternativa conveniente para concatenar explicitamente as cadeias de caracteres recuperadas do objeto da coleção retornado pela propriedade Match.Groups.

O exemplo usa o método Match.Result com duas substituições, ${proto} e ${port}, para incluir os grupos capturados na cadeia de caracteres de saída. Você pode recuperar os grupos capturados do objeto GroupCollection da correspondência em vez disso, conforme mostra o código a seguir.

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

Confira também