Share via


Ejemplo: Buscar etiquetas HREF

Actualización: noviembre 2007

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

Como el objeto Regex se utiliza en el método DumHRefs, al que se puede llamar varias veces desde el código del usuario, se utiliza 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. En este ejemplo, el metacarácter \s coincide con cualquier carácter de espacio, y \S coincide con cualquier carácter que no sea un espacio.

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 DumHRefs.

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

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 recuerda también la cadena buscada y la expresión regular utilizada, para poder utilizarlas en 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, Regex permite utilizar la sintaxis (?<name>…) para capturar una coincidencia en una ranura especificada (puede asignarle un nombre a la ranura utilizando 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

Otros recursos

Expresiones regulares de .NET Framework