Dil

Normal ifade örneği: HREF'leri tarama

Aşağıdaki örnek, bir girdi dizesinde arama yapar ve tüm href="..." değerlerini ve bunların dizedeki konumlarını görüntüler.

Warning

System.Text.RegularExpressions öğesinin güvenilmeyen girdilerle sınırsız kullanımı, uygulamaları hizmet reddi saldırılarına maruz bırakabilir. Güvenilmeyen girişlerle .NET normal ifadelerini güvenli bir şekilde nasıl kullanacağınızla ilgili yönergeler için .NET'te normal ifadeler için en iyi uygulamalar bölümüne başvurun.

Regex nesnesi

DumpHRefs yöntemi kullanıcı kodundan birden çok kez çağrılabildiğinden (static Visual Basic) Shared yöntemini kullanır Regex.Match(String, String, RegexOptions) . Bu, normal ifade altyapısının normal ifadeyi önbelleğe almasına olanak tanır ve yöntem her çağrıldığında yeni Regex bir nesnenin örneğini oluşturma yükünü önler. Match Daha sonra dizedeki tüm eşleşmeleri yinelemek için bir nesne kullanılır.

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

Aşağıdaki örnek, ardından DumpHRefs yöntemine yapılan bir çağrıyı gösterir.

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

Normal ifade düzeni href\s*=\s*(?:["'](?<1>[^"']*)["']|(?<1>[^>\s]+)) aşağıdaki tabloda gösterildiği gibi yorumlanır.

Desen Açıklama
href Tam olarak "href" dizgesini eşleştirin. Eşleşme büyük-küçük harfe duyarlı değil.
\s* Sıfır veya daha fazla boşluk karakteriyle eşleş.
= Eşittir işaretiyle eşleş.
\s* Sıfır veya daha fazla boşluk karakteriyle eşleş.
(?: Yakalama olmayan bir grup başlatın.
["'](?<1>[^"']*)["'] Bir tırnak işaretini veya kesme işaretini, ardından tırnak işareti ya da kesme işareti dışındaki herhangi bir karakterle eşleşen bir yakalama grubunu ve ardından bir tırnak işareti veya kesme işaretini eşleştirin. Adlı 1 grup bu desene dahil edilir.
| Önceki ifadeyle veya sonraki ifadeyle eşleşen Boole VEYA.
(?<1>[^>\s]+) Büyüktür işareti veya boşluk karakteri dışında herhangi bir karakterle eşleştirmek için negatif küme kullanan bir yakalama grubu. Adlı 1 grup bu desene dahil edilir.
) Yakalamayan grubu sonlandırın.

Eşleşme sonucu sınıfı

Bir aramanın sonuçları, arama tarafından ayıklanan tüm alt dizelere erişim sağlayan sınıfında depolanır Match . Ayrıca aranmakta olan dizeyi ve kullanılan normal ifadeyi anımsar, böylece son aramanın sona erdiği yerden başlayarak başka bir arama yapmak için yöntemini çağırabilir Match.NextMatch .

Açıkça adlandırılmış yakalamalar

Geleneksel düzenli ifadelerde, yakalama parantezleri otomatik olarak sırayla numaralandırılır. Bu iki soruna yol açar. İlk olarak, bir parantez kümesi eklenerek veya kaldırılarak normal ifade değiştirilirse, numaralandırılmış yakalamalara başvuran tüm kodlar yeni numaralandırmayı yansıtacak şekilde yeniden yazılmalıdır. İkinci olarak, kabul edilebilir bir eşleşme için iki alternatif ifade sağlamak için genellikle farklı parantez kümeleri kullanıldığından, iki ifadeden hangisinin gerçekten sonuç döndüreceğini belirlemek zor olabilir.

Bu sorunları gidermek için sınıfı, Regex belirli bir yuvada eşleşme yakalama söz dizimini (?<name>…) destekler (yuva bir dize veya tamsayı kullanılarak adlandırılabilir; tamsayılar daha hızlı geri çağrılabilir). Bu nedenle, aynı dize için alternatif eşleşmelerin tümü aynı yere yönlendirilebilir. Çakışma durumunda, bir yuvaya yerleştirilen son eşleşme başarılı olan eşleşmedir. (Ancak, tek bir yuva için birden çok eşleşmenin tam listesi mevcuttur. Ayrıntılar için Group.Captures koleksiyonuna bakın.)

Ayrıca bakınız