Příklad regulárního výrazu: Vyhledávání atributů HREF

Následující příklad prohledá vstupní řetězec a zobrazí všechny href="..." hodnoty a jejich umístění v řetězci.

Warning

Neomezené použití System.Text.RegularExpressions s nedůvěryhodným vstupem může podléhat aplikacím útokům na dostupnost služby. Pokyny k bezpečnému použití .NET regulárních výrazů s nedůvěryhodným vstupem najdete v osvědčených postupech pro regulární výrazy v .NET.

Objekt Regex

Vzhledem k tomu, že metodu DumpHRefs lze volat vícekrát z uživatelského kódu, používá metodu static (Sharedv Visual Basic). Regex.Match(String, String, RegexOptions) To umožňuje modulu regulárních výrazů ukládat regulární výraz do mezipaměti a zabraňuje režii spojené s vytvářením nové instance objektu Regex při každém volání metody. Objekt Match se pak použije k iteraci všech shod v řetězci.

private static void DumpHRefs(string inputString)
{
    string hrefPattern = @"href\s*=\s*(?:[""'](?<1>[^""']*)[""']|(?<1>[^>\s]+))";

    try
    {
        Match regexMatch = Regex.Match(inputString, hrefPattern,
                                       RegexOptions.IgnoreCase | RegexOptions.Compiled,
                                       TimeSpan.FromSeconds(1));
        while (regexMatch.Success)
        {
            Console.WriteLine($"Found href {regexMatch.Groups[1]} at {regexMatch.Groups[1].Index}");
            regexMatch = regexMatch.NextMatch();
        }
    }
    catch (RegexMatchTimeoutException)
    {
        Console.WriteLine("The matching operation timed out.");
    }
}
Private Sub DumpHRefs(inputString As String)
    Dim hrefPattern As String = "href\s*=\s*(?:[""'](?<1>[^""']*)[""']|(?<1>[^>\s]+))"

    Try
        Dim regexMatch = Regex.Match(inputString, hrefPattern,
                                     RegexOptions.IgnoreCase Or RegexOptions.Compiled,
                                     TimeSpan.FromSeconds(1))
        Do While regexMatch.Success
            Console.WriteLine($"Found href {regexMatch.Groups(1)} at {regexMatch.Groups(1).Index}.")
            regexMatch = regexMatch.NextMatch()
        Loop
    Catch e As RegexMatchTimeoutException
        Console.WriteLine("The matching operation timed out.")
    End Try
End Sub

Následující příklad pak ilustruje volání DumpHRefs metody.

public static void Main()
{
    string inputString = "My favorite web sites include:</P>" +
                         "<A HREF=\"https://learn.microsoft.com/en-us/dotnet/\">" +
                         ".NET Documentation</A></P>" +
                         "<A HREF=\"http://www.microsoft.com\">" +
                         "Microsoft Corporation Home Page</A></P>" +
                         "<A HREF=\"https://devblogs.microsoft.com/dotnet/\">" +
                         ".NET Blog</A></P>";
    DumpHRefs(inputString);
}
// The example displays the following output:
//       Found href https://learn.microsoft.com/dotnet/ at 43
//       Found href http://www.microsoft.com at 114
//       Found href https://devblogs.microsoft.com/dotnet/ at 188
Public Sub Main()
    Dim inputString As String = "My favorite web sites include:</P>" &
                                "<A HREF=""https://learn.microsoft.com/en-us/dotnet/"">" &
                                ".NET Documentation</A></P>" &
                                "<A HREF=""http://www.microsoft.com"">" &
                                "Microsoft Corporation Home Page</A></P>" &
                                "<A HREF=""https://devblogs.microsoft.com/dotnet/"">" &
                                ".NET Blog</A></P>"
    DumpHRefs(inputString)
End Sub
' The example displays the following output:
'       Found href https://learn.microsoft.com/dotnet/ at 43
'       Found href http://www.microsoft.com at 114
'       Found href https://devblogs.microsoft.com/dotnet/ at 188

Vzor href\s*=\s*(?:["'](?<1>[^"']*)["']|(?<1>[^>\s]+)) regulárního výrazu je interpretován, jak je znázorněno v následující tabulce.

Pattern Description
href Odpovídá literálnímu řetězci "href". Shoda nerozlišuje malá a velká písmena.
\s* Odpovídá nulovému nebo více bílým znakům.
= Porovnejte znaménko rovnosti.
\s* Odpovídá nulovému nebo více bílým znakům.
(?: Začněte nezachytávací skupinu.
["'](?<1>[^"']*)["'] Porovná uvozovky nebo apostrof následovanou zachytáváním skupiny, která odpovídá jakémukoli jinému znaku než uvozovky nebo apostrofu, následované uvozovkami nebo apostrofem. V tomto vzoru je zahrnuta skupina s názvem 1 .
| Logická hodnota OR, která odpovídá předchozímu výrazu nebo dalšímu výrazu.
(?<1>[^>\s]+) Zachytávací skupina, která používá negovanou množinu k odpovídání libovolnému znaku kromě znaku větší než (>) nebo bílého znaku. V tomto vzoru je zahrnuta skupina s názvem 1 .
) Ukončete nezachytávací skupinu.

Třída výsledku shody

Výsledky hledání jsou uloženy ve Match třídě, která poskytuje přístup ke všem podřetěžců extrahovaným vyhledáváním. Pamatuje si také hledaný řetězec a použitý regulární výraz, takže může volat metodu Match.NextMatch k provedení dalšího hledání, které začíná tam, kde skončil poslední.

Explicitně pojmenované zachytávání

V tradičních regulárních výrazech jsou zachytávací závorky automaticky číslovány sekvenčně. To vede ke dvěma problémům. Za prvé, pokud je regulární výraz upraven vložením nebo odebráním dvojice závorek, musí být veškerý kód, který odkazuje na číslované zachycené skupiny, přepsán tak, aby odpovídal novému číslování. Zadruhé, protože různé sady závorek se často používají k poskytnutí dvou alternativních výrazů pro přijatelnou shodu, může být obtížné určit, které z těchto dvou výrazů skutečně vrátily výsledek.

Aby se tyto problémy vyřešily, Regex třída podporuje syntaxi (?<name>…) pro zachycení shody do zadaného slotu (slot lze pojmenovat pomocí řetězce nebo celého čísla; celá čísla lze odvolat rychleji). Proto lze alternativní shody pro stejný řetězec všechny směrovat na stejné místo. V případě konfliktu je za úspěšnou shodu považována poslední shoda vložená do slotu. (Nicméně je k dispozici úplný seznam více shod pro jeden slot. Podrobnosti najdete v kolekci Group.Captures.)

Viz také