Procedimiento para extraer un protocolo y un número de puerto de una dirección URL

En los siguientes ejemplos se extrae un protocolo y un número de puerto de una dirección URL.

Advertencia

Cuando se usa System.Text.RegularExpressions para procesar entradas que no son de confianza, pase un tiempo de expiración. Un usuario malintencionado puede proporcionar entradas a RegularExpressions y provocar un ataque por denegación de servicio. Las API del marco ASP.NET Core en las que se usa RegularExpressions pasan un tiempo de expiración.

Ejemplo

El ejemplo usa el método Match.Result para devolver el protocolo seguido de dos puntos y del número de puerto.

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

El patrón de la expresión regular ^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/ puede interpretarse como se muestra en la tabla siguiente.

Patrón Descripción
^ Comenzar la búsqueda de coincidencia al principio de la cadena.
(?<proto>\w+) Buscar coincidencias con uno o más caracteres alfabéticos. Asigne a este grupo el nombre proto.
:// Buscar coincidencias con un signo de dos puntos seguido por dos barras diagonales.
[^/]+? Buscar coincidencias con una o más apariciones (pero el menor número posible) de cualquier carácter que no sea una barra diagonal.
(?<port>:\d+)? Buscar una coincidencia con cero o una aparición de una coma seguida de uno o más caracteres decimales. Asigne a este grupo el nombre port.
/ Buscar una coincidencia con una barra diagonal.

El método Match.Result expande la secuencia de reemplazo ${proto}${port}, que concatena el valor de los dos grupos con nombre capturados en el patrón de expresión regular. Resulta cómodo concatenar explícitamente las cadenas recuperadas del objeto de la colección devueltas por la propiedad Match.Groups.

El ejemplo usa el método Match.Result con dos sustituciones, ${proto} y ${port}, para incluir los grupos capturados en la cadena de salida. En su lugar, puede recuperar los grupos capturados del objeto de coincidencia GroupCollection, como se muestra en el siguiente código.

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

Vea también