Bagikan melalui


Contoh ekspresi reguler: Memindai HREF

Contoh berikut mencari string input dan menampilkan semua href="..." nilai dan lokasinya dalam string.

Peringatan

Saat menggunakan System.Text.RegularExpressions untuk memproses masukan yang tidak tepercaya, berikan batas waktu. Pengguna berbahaya dapat memberikan input ke RegularExpressions, yang menyebabkan serangan Penolakan Layanan. ASP.NET API kerangka kerja Core yang menggunakan RegularExpressions batas waktu.

Objek Regex

Karena DumpHRefs metode ini dapat dipanggil beberapa kali dari kode pengguna, metode ini menggunakan static metode (Shared dalam Visual BasicRegex.Match(String, String, RegexOptions)). Ini memungkinkan mesin ekspresi reguler untuk men-chace ekspresi reguler dan menghindari overhead membuat instans objek baru Regex setiap kali metode dipanggil. Objek Match kemudian digunakan untuk melakukan iterasi melalui semua kecocokan dalam string.

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

Contoh berikut kemudian mengilustrasikan panggilan ke DumpHRefs metode.

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

Pola regex href\s*=\s*(?:["'](?<1>[^"']*)["']|(?<1>[^>\s]+)) ditafsirkan seperti yang ditunjukkan pada tabel berikut.

Pola Deskripsi
href Mencocokkan string harfiah "href". Pencocokan tidak peka huruf besar/kecil.
\s* Cocokkan nol atau lebih karakter spasi kosong.
= Mencocokkan tanda tangan sama dengan.
\s* Cocokkan nol atau lebih karakter spasi kosong.
(?: Memulai grup yang tidak mengambil.
["'](?<1>[^"']*)["'] Mencocokkan dengan tanda kutip atau apostrof, diikuti oleh grup pengambilan yang cocok dengan karakter apa pun selain tanda kutip atau apostrof, diikuti dengan tanda kutip atau apostrof. Grup bernama 1 disertakan dalam pola ini.
| Boolean OR yang cocok dengan ekspresi sebelumnya atau ekspresi berikutnya.
(?<1>[^>\s]+) Grup penangkapan yang menggunakan set yang dinegasikan untuk mencocokkan karakter apa pun selain tanda yang lebih besar dari atau karakter spasi kosong. Grup bernama 1 disertakan dalam pola ini.
) Memulai grup yang tidak mengambil.

Mencocokkan kelas hasil

Hasil pencarian disimpan di Match kelas, yang menyediakan akses ke semua substring yang diekstrak oleh pencarian. Ini juga mengingat string yang dicari dan ekspresi reguler yang digunakan, sehingga dapat memanggil Match.NextMatch metode untuk melakukan pencarian lain dimulai di mana yang terakhir berakhir.

Pengambilan bernama secara eksplisit

Dalam ekspresi reguler tradisional, mengambil tanda kurung secara otomatis diberi nomor secara berurutan. Ini menyebabkan dua masalah. Pertama, jika ekspresi reguler dimodifikasi dengan menyisipkan atau menghapus sekumpulan tanda kurung, semua kode yang mengacu pada tangkapan bernomor harus ditulis ulang untuk mencerminkan penomoran baru. Kedua, karena kumpulan tanda kurung yang berbeda sering digunakan untuk memberikan dua ekspresi alternatif untuk kecocokan yang dapat diterima, mungkin sulit untuk menentukan dari dua ekspresi mana yang benar-benar mengembalikan hasil.

Untuk mengatasi masalah ini, Regex kelas mendukung sintaks (?<name>…) untuk mengambil kecocokan ke dalam slot tertentu (slot dapat diberi nama menggunakan string atau bilangan bulat; bilangan bulat dapat dipanggil kembali dengan lebih cepat). Dengan demikian, kecocokan alternatif untuk string yang sama semuanya dapat diarahkan ke tempat yang sama. Jika terjadi konflik, kecocokan terakhir yang dijatuhkan ke slot adalah kecocokan yang berhasil. (Namun, daftar lengkap beberapa kecocokan untuk satu slot tersedia. Group.Captures Lihat koleksi untuk detailnya.)

Lihat juga