Compartilhar via


Exemplo: Procurando HREFs

O exemplo a seguir procura uma sequência de caracteres de entrada e imprime todos os valores href="…" e suas localizações na sequência de caracteres.

O objeto Regex

Porque o DumpHRefs método pode ser chamado várias vezes do código do usuário, ele usa o static (Shared em Visual Basic) Regex.Match(String, String, RegexOptions) método. Isso permite que o mecanismo de expressões regulares para armazenar em cache a expressão regular e evita a sobrecarga de instanciar uma nova Regex cada vez que o método é chamado de objeto. A Match objeto é usado para iterar por meio de todas as correspondências na string.

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();
   }   
}

O exemplo a seguir, em seguida, ilustra uma chamada para o DumpHRefs método.

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

O padrão de expressão regular href\s*=\s*(?:"(?<1>[^""]*)"|(?<1>\S+)) é interpretado como mostrado na tabela a seguir.

Padrão

Descrição

href

Coincide com a seqüência literal "href". A correspondência não diferencia maiúsculas de minúsculas.

\s*

Corresponde a zero ou mais caracteres de espaço em branco.

=

Corresponde ao sinal de igual.

\s*

Corresponde a zero ou mais caracteres de espaço em branco.

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

Coincidir com um dos seguintes sem atribuir o resultado para um grupo capturado:

  • Aspas, seguida de zero ou mais ocorrências de qualquer caractere diferente de aspas, seguida por uma aspa. O grupo chamado 1 está incluído neste padrão.

  • Um ou mais caracteres não-espaço em branco. O grupo chamado 1 está incluído neste padrão.

(?<1>[^"]*)

Atribuir zero ou mais ocorrências de qualquer caractere diferente de aspas para o grupo de capturando chamado 1.

"(?<1>\S+)

Atribuir um ou mais caracteres não-espaço em branco para o grupo de capturando chamado 1.

Classe dos resultados de correspondência

Os resultados de uma pesquisa são armazenados na Match classe, que fornece acesso a todas as subseqüências extraídos pela pesquisa. Ele também lembra a seqüência de caracteres que está sendo pesquisada e a expressão regular que está sendo usada, portanto, ele pode chamar o Match.NextMatch método para executar outra pesquisa começando onde o último terminou.

Capturas expliciatamente nomeadas

Em expressões regulares tradicionais, parênteses de captura são automaticamente numerados sequencialmente. Isso leva a dois problemas. Primeiro, se uma expressão regular for modificada inserindo-se ou removendo-se um conjunto de parênteses, todo o código que se refere às captura numeradas deve ser reescrito para refletir a nova numeração. Em segundo lugar, como diferentes conjuntos de parênteses geralmente são usados para fornecer duas expressões alternativas para uma correspondência aceitável, talvez seja difícil determinar qual das duas expressões de fato retornou um resultado.

Para resolver esses problemas, o Regex classe oferece suporte a sintaxe (?<name>…) para capturar uma correspondência em um slot especificado (slot pode ser nomeado usando uma seqüência de caracteres ou um inteiro; inteiros podem ser recuperados mais rapidamente). Assim, correspondências alternativas para a mesma sequência de caracteres podem ser todas direcionados para o mesmo local. Em caso de conflito, a última correspondência solta em um slot é a correspondência com êxito. (No entanto, uma lista completa de correspondências múltiplas para um slot único está disponível. Consulte a coleção Group.Captures para detalhes.)

Consulte também

Conceitos

Expressões Regulares do .NET Framework