Exemplo: Varredura de 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 a Regex o objeto é usado na DumHRefs método, que pode ser chamado várias vezes do código do usuário, o static (Shared no Visual Basic) Regex.Match(String, String, RegexOptions) método é usado. Isso permite que o mecanismo de expressão regular para armazenar em cache a expressão regular e evita a sobrecarga de instanciar um novo Regex objeto cada vez que o método é chamado. A Match objeto é usado para iterar por todas as correspondências na seqüência de caracteres. Nesse exemplo, o metacaractere \s corresponde a qualquer caractere de espaço, e \S corresponde a qualquer caractere que não seja de espaço.
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 ilustra, em seguida, uma telefonar para o DumHRefs 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
Classe dos resultados de correspondência
Os resultados de uma pesquisa são armazenados na classe Match, que fornece acesso a todos as subsequências de caracteres extraídas pela pesquisa.Ela também lembra a sequência de caracteres que está sendo pesquisada e a expressão regular que está sendo usada, para que ela possa usá-los para executar outra pesquisa iniciando onde a última 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, Regex oferece suporte à sintaxe (?<name>…) para capturar uma correspondência em um slot especificado (o slot pode ser nomeado usando uma sequê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.)