Share via


Ejemplo: Buscar etiquetas HREF

En el ejemplo siguiente se busca una cadena de entrada y se imprimen todos los valores href="…" y sus posiciones en la cadena.

El objeto Regex

Puesto que el método DumpHRefs puede invocarse varias veces desde el código de usuario, se emplea el método static (Shared en Visual Basic) Regex.Match(String, String, RegexOptions). De este modo, el motor de expresiones regulares puede almacenar en memoria caché la expresión regular y evitar la sobrecarga que supone crear una instancia de un nuevo objeto Regex cada vez que se llama al método. A continuación, se utiliza un objeto Match para recorrer en iteración todas las coincidencias de la cadena.

Private Sub DumpHRefs(inputString As String) 
   Dim m As Match
   Dim HRefPattern As String = "href\s*=\s*(?:""(?<1>[^""]*)""|(?<1>\S+))"

   m = Regex.Match(inputString, HRefPattern, _ 
                   RegexOptions.IgnoreCase Or RegexOptions.Compiled)
   Do While m.Success
      Console.WriteLine("Found href {0} at {1}.", _
                        m.Groups(1), m.Groups(1).Index)
      m = m.NextMatch()
   Loop   
End Sub
private static void DumpHRefs(string inputString) 
{
   Match m;
   string HRefPattern = "href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))";

   m = Regex.Match(inputString, HRefPattern, 
                   RegexOptions.IgnoreCase | RegexOptions.Compiled);
   while (m.Success)
   {
      Console.WriteLine("Found href " + m.Groups[1] + " at " 
         + m.Groups[1].Index);
      m = m.NextMatch();
   }   
}

En el siguiente ejemplo se muestra una llamada al método DumpHRefs.

Public Sub Main()
   Dim inputString As String = "My favorite web sites include:</P>" & _
                               "<A HREF=""https://msdn2.microsoft.com"">" & _
                               "MSDN Home Page</A></P>" & _
                               "<A HREF=""https://www.microsoft.com"">" & _
                               "Microsoft Corporation Home Page</A></P>" & _
                               "<A HREF=""https://blogs.msdn.com/bclteam"">" & _
                               ".NET Base Class Library blog</A></P>"
   DumpHRefs(inputString)                     
End Sub
' The example displays the following output:
'       Found href https://msdn2.microsoft.com at 43
'       Found href https://www.microsoft.com at 102
'       Found href https://blogs.msdn.com/bclteam/) at 176
public static void Main()
{
   string inputString = "My favorite web sites include:</P>" +
                        "<A HREF=\"https://msdn2.microsoft.com\">" +
                        "MSDN Home Page</A></P>" +
                        "<A HREF=\"https://www.microsoft.com\">" +
                        "Microsoft Corporation Home Page</A></P>" +
                        "<A HREF=\"https://blogs.msdn.com/bclteam\">" +
                        ".NET Base Class Library blog</A></P>";
   DumpHRefs(inputString);                     

}
// The example displays the following output:
//       Found href https://msdn2.microsoft.com at 43
//       Found href https://www.microsoft.com at 102
//       Found href https://blogs.msdn.com/bclteam at 176

El modelo de expresión regular href\s*=\s*(?:"(?<1>[^""]*)"|(?<1>\S+)) se interpreta como se muestra en la tabla siguiente.

Modelo

Descripción

href

Busca coincidencias con la cadena literal "href". La búsqueda no distingue entre mayúsculas y minúsculas.

\s*

Busca coincidencias con cero o más caracteres de espacio en blanco.

=

Busca coincidencias con el signo de igualdad.

\s*

Busca coincidencias con cero o más caracteres de espacio en blanco.

(?:"(?<1>[^""]*)"|(?<1>\S+))

Busca coincidencias con uno de los siguientes elementos sin asignar el resultado a un grupo capturado:

  • Una comilla, seguida de cero o más apariciones de cualquier carácter que no sea una comilla, seguidas de una comilla. Este modelo incluye el grupo denominado 1.

  • Uno o más caracteres que no sean un espacio en blanco. Este modelo incluye el grupo denominado 1.

(?<1>[^"]*)

Asigna cero o más apariciones de cualquier carácter que no sea una comilla al grupo de captura denominado 1.

"(?<1>\S+)

Asigna uno o más caracteres que no sean un espacio en blanco al grupo de captura denominado 1.

Clase de resultados Match

Los resultados de una búsqueda se almacenan en la clase Match, que proporciona acceso a todas las subcadenas extraídas por la búsqueda. Esta clase también recuerda la cadena buscada y la expresión regular utilizada, por lo que puede llamar al método Match.NextMatch para realizar otra búsqueda, que comenzará donde terminó la última.

Capturas con nombre explícito

En las expresiones regulares tradicionales, los paréntesis de captura se numeran automáticamente de forma secuencial. Esto implica dos problemas. En primer lugar, si se modifica una expresión regular al insertar o quitar un grupo de paréntesis, todo el código que hace referencia a las capturas numeradas debe reescribirse para que la nueva numeración quede reflejada. En segundo lugar, dado que a menudo se utilizan grupos de paréntesis distintos con el fin de proporcionar expresiones alternativas para la búsqueda de una coincidencia aceptable, puede resultar difícil determinar cual de las dos expresiones ha devuelto en realidad un resultado.

Para solucionar estos problemas, la clase Regex admite la sintaxis (?<name>…) para capturar una coincidencia en una ranura especificada (puede asignarle un nombre a la ranura usando una cadena o un entero, aunque resulta más sencillo recordar enteros). De esta forma, todas las coincidencias alternativas de la misma cadena pueden dirigirse al mismo lugar. En caso de conflicto, la última coincidencia situada en una ranura es la coincidencia correcta. Sin embargo, se puede disponer de una lista completa de varias coincidencias para una única ranura. Vea la colección Group.Captures para obtener información detallada.

Vea también

Conceptos

Expresiones regulares de .NET Framework