Ekspresi reguler .NET
Ekspresi reguler memberikan metode yang kuat, fleksibel, dan efisien untuk memproses teks. Notasi pencocokan pola ekstensif dari ekspresi reguler memungkinkan Anda mengurai teks dalam jumlah besar dengan cepat untuk:
- Temukan pola karakter tertentu.
- Validasi teks untuk memastikan bahwa teks cocok dengan pola yang telah ditentukan sebelumnya (seperti alamat email).
- Ekstrak, edit, ganti, atau hapus substring teks.
- Tambahkan string yang diekstrak ke koleksi untuk menghasilkan laporan.
Untuk banyak aplikasi yang menangani string atau yang mengurai blok besar teks, ekspresi reguler adalah alat yang sangat diperlukan.
Cara kerja ekspresi reguler
Bagian tengah pemrosesan teks dengan ekspresi reguler adalah mesin ekspresi reguler, yang diwakili oleh System.Text.RegularExpressions.Regex objek di .NET. Minimal, memproses teks menggunakan ekspresi reguler mengharuskan mesin ekspresi reguler disediakan dengan dua item informasi berikut:
Pola ekspresi reguler untuk mengidentifikasi dalam teks.
Dalam .NET, pola ekspresi reguler didefinisikan oleh sintaks atau bahasa khusus, yang kompatibel dengan ekspresi reguler Perl 5 dan menambahkan beberapa fitur tambahan seperti pencocokan kanan-ke-kiri. Untuk informasi selengkapnya, lihat Bahasa Regex - Referensi Cepat.
Teks yang akan diurai untuk pola ekspresi reguler.
Metode Regex kelas memungkinkan Anda melakukan operasi berikut:
Tentukan apakah pola ekspresi reguler terjadi dalam teks input dengan memanggil Regex.IsMatch metode. Untuk contoh yang menggunakan IsMatch metode untuk memvalidasi teks, lihat Cara: Memverifikasi bahwa String Dalam Format Email yang Valid.
Ambil satu atau semua kemunculan teks yang cocok dengan pola ekspresi reguler dengan memanggil Regex.Match metode atau Regex.Matches. Metode sebelumnya mengembalikan System.Text.RegularExpressions.Match objek yang menyediakan informasi tentang teks yang cocok. Yang terakhir mengembalikan MatchCollection objek yang berisi satu System.Text.RegularExpressions.Match objek untuk setiap kecocokan yang ditemukan dalam teks yang diurai.
Ganti teks yang cocok dengan pola ekspresi reguler dengan memanggil Regex.Replace metode. Untuk contoh yang menggunakan Replace metode untuk mengubah format tanggal dan menghapus karakter yang tidak valid dari string, lihat Cara: Strip Karakter Tidak Valid dari String dan Contoh: Mengubah Format Tanggal.
Untuk gambaran umum model objek ekspresi reguler, lihat Model Objek Ekspresi Reguler.
Untuk informasi selengkapnya tentang bahasa ekspresi reguler, lihat Bahasa Ekspresi Reguler - Referensi Cepat atau unduh dan cetak salah satu brosur berikut:
Contoh ekspresi reguler
Kelas ini String mencakup metode pencarian string dan penggantian yang dapat Anda gunakan saat Anda ingin menemukan string harfiah dalam string yang lebih besar. Ekspresi reguler paling berguna baik ketika Anda ingin menemukan salah satu dari beberapa substring dalam string yang lebih besar, atau ketika Anda ingin mengidentifikasi pola dalam string, seperti yang diilustrasikan contoh berikut.
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.
Tip
Namespace layanan System.Web.RegularExpressions berisi sejumlah objek ekspresi reguler yang menerapkan pola ekspresi reguler yang telah ditentukan sebelumnya untuk mengurai string dari dokumen HTML, XML, dan ASP.NET. Misalnya, TagRegex kelas mengidentifikasi tag mulai dalam string, dan CommentRegex kelas mengidentifikasi komentar ASP.NET dalam string.
Contoh 1: Ganti substring
Asumsikan bahwa milis berisi nama yang terkadang menyertakan judul (Mr., Mrs., Miss, atau Ms.) bersama dengan nama depan dan belakang. Misalkan Anda tidak ingin menyertakan judul saat membuat label amplop dari daftar. Dalam hal ini, Anda dapat menggunakan ekspresi reguler untuk menghapus judul, seperti yang diilustrasikan contoh berikut:
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = "(Mr\\.? |Mrs\\.? |Miss |Ms\\.? )";
string[] names = { "Mr. Henry Hunt", "Ms. Sara Samuels",
"Abraham Adams", "Ms. Nicole Norris" };
foreach (string name in names)
Console.WriteLine(Regex.Replace(name, pattern, String.Empty));
}
}
// The example displays the following output:
// Henry Hunt
// Sara Samuels
// Abraham Adams
// Nicole Norris
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "(Mr\.? |Mrs\.? |Miss |Ms\.? )"
Dim names() As String = {"Mr. Henry Hunt", "Ms. Sara Samuels", _
"Abraham Adams", "Ms. Nicole Norris"}
For Each name As String In names
Console.WriteLine(Regex.Replace(name, pattern, String.Empty))
Next
End Sub
End Module
' The example displays the following output:
' Henry Hunt
' Sara Samuels
' Abraham Adams
' Nicole Norris
Pola (Mr\.? |Mrs\.? |Miss |Ms\.? )
ekspresi reguler cocok dengan kemunculan "Mr", "Mr. ", "Mrs", "Mrs. ", "Miss ", "Ms ", atau "Ms. ". Panggilan ke Regex.Replace metode menggantikan string yang cocok dengan ; dengan String.Emptykata lain, ia menghapusnya dari string asli.
Contoh 2: Mengidentifikasi kata duplikat
Secara tidak sengaja menduplikasi kata-kata adalah kesalahan umum yang dilakukan penulis. Gunakan ekspresi reguler untuk mengidentifikasi kata-kata duplikat, seperti yang ditunjukkan contoh berikut:
using System;
using System.Text.RegularExpressions;
public class Class1
{
public static void Main()
{
string pattern = @"\b(\w+?)\s\1\b";
string input = "This this is a nice day. What about this? This tastes good. I saw a a dog.";
foreach (Match match in Regex.Matches(input, pattern, RegexOptions.IgnoreCase))
Console.WriteLine("{0} (duplicates '{1}') at position {2}",
match.Value, match.Groups[1].Value, match.Index);
}
}
// The example displays the following output:
// This this (duplicates 'This') at position 0
// a a (duplicates 'a') at position 66
Imports System.Text.RegularExpressions
Module modMain
Public Sub Main()
Dim pattern As String = "\b(\w+?)\s\1\b"
Dim input As String = "This this is a nice day. What about this? This tastes good. I saw a a dog."
For Each match As Match In Regex.Matches(input, pattern, RegexOptions.IgnoreCase)
Console.WriteLine("{0} (duplicates '{1}') at position {2}", _
match.Value, match.Groups(1).Value, match.Index)
Next
End Sub
End Module
' The example displays the following output:
' This this (duplicates 'This') at position 0
' a a (duplicates 'a') at position 66
Pola ekspresi reguler \b(\w+?)\s\1\b
dapat ditafsirkan sebagai berikut:
Pola | Interpretasi |
---|---|
\b |
Mulailah dari batas kata. |
(\w+?) |
Cocokkan nol atau lebih karakter kata, tetapi sesedikit mungkin karakter. Bersama-sama, mereka membentuk grup yang dapat disebut sebagai \1 . |
\s |
Cocokkan karakter spasi kosong. |
\1 |
Cocokkan substring yang sama dengan grup bernama \1 . |
\b |
Cocokkan batas kata. |
Metode Regex.Matches ini dipanggil dengan opsi ekspresi reguler diatur ke RegexOptions.IgnoreCase. Oleh karena itu, operasi pencocokan tidak peka huruf besar/kecil, dan contohnya mengidentifikasi substring "Ini" sebagai duplikasi.
String input mencakup substring "ini? Ini”. Namun, karena tanda baca intervensi, tanda baca tidak diidentifikasi sebagai duplikasi.
Contoh 3: Membangun ekspresi reguler yang sensitif terhadap budaya secara dinamis
Contoh berikut menggambarkan kekuatan ekspresi reguler yang dikombinasikan dengan fleksibilitas yang ditawarkan oleh . Fitur globalisasi NET. Ini menggunakan NumberFormatInfo objek untuk menentukan format nilai mata uang dalam budaya sistem saat ini. Kemudian menggunakan informasi tersebut untuk membangun ekspresi reguler secara dinamis yang mengekstrak nilai mata uang dari teks. Untuk setiap kecocokan, ini mengekstrak subgrup yang hanya berisi string numerik, mengonversinya menjadi Decimal nilai, dan menghitung total yang sedang berjalan.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
// Define text to be parsed.
string input = "Office expenses on 2/13/2008:\n" +
"Paper (500 sheets) $3.95\n" +
"Pencils (box of 10) $1.00\n" +
"Pens (box of 10) $4.49\n" +
"Erasers $2.19\n" +
"Ink jet printer $69.95\n\n" +
"Total Expenses $ 81.58\n";
// Get current culture's NumberFormatInfo object.
NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat;
// Assign needed property values to variables.
string currencySymbol = nfi.CurrencySymbol;
bool symbolPrecedesIfPositive = nfi.CurrencyPositivePattern % 2 == 0;
string groupSeparator = nfi.CurrencyGroupSeparator;
string decimalSeparator = nfi.CurrencyDecimalSeparator;
// Form regular expression pattern.
string pattern = Regex.Escape( symbolPrecedesIfPositive ? currencySymbol : "") +
@"\s*[-+]?" + "([0-9]{0,3}(" + groupSeparator + "[0-9]{3})*(" +
Regex.Escape(decimalSeparator) + "[0-9]+)?)" +
(! symbolPrecedesIfPositive ? currencySymbol : "");
Console.WriteLine( "The regular expression pattern is:");
Console.WriteLine(" " + pattern);
// Get text that matches regular expression pattern.
MatchCollection matches = Regex.Matches(input, pattern,
RegexOptions.IgnorePatternWhitespace);
Console.WriteLine("Found {0} matches.", matches.Count);
// Get numeric string, convert it to a value, and add it to List object.
List<decimal> expenses = new List<Decimal>();
foreach (Match match in matches)
expenses.Add(Decimal.Parse(match.Groups[1].Value));
// Determine whether total is present and if present, whether it is correct.
decimal total = 0;
foreach (decimal value in expenses)
total += value;
if (total / 2 == expenses[expenses.Count - 1])
Console.WriteLine("The expenses total {0:C2}.", expenses[expenses.Count - 1]);
else
Console.WriteLine("The expenses total {0:C2}.", total);
}
}
// The example displays the following output:
// The regular expression pattern is:
// \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?)
// Found 6 matches.
// The expenses total $81.58.
Imports System.Collections.Generic
Imports System.Globalization
Imports System.Text.RegularExpressions
Public Module Example
Public Sub Main()
' Define text to be parsed.
Dim input As String = "Office expenses on 2/13/2008:" + vbCrLf + _
"Paper (500 sheets) $3.95" + vbCrLf + _
"Pencils (box of 10) $1.00" + vbCrLf + _
"Pens (box of 10) $4.49" + vbCrLf + _
"Erasers $2.19" + vbCrLf + _
"Ink jet printer $69.95" + vbCrLf + vbCrLf + _
"Total Expenses $ 81.58" + vbCrLf
' Get current culture's NumberFormatInfo object.
Dim nfi As NumberFormatInfo = CultureInfo.CurrentCulture.NumberFormat
' Assign needed property values to variables.
Dim currencySymbol As String = nfi.CurrencySymbol
Dim symbolPrecedesIfPositive As Boolean = CBool(nfi.CurrencyPositivePattern Mod 2 = 0)
Dim groupSeparator As String = nfi.CurrencyGroupSeparator
Dim decimalSeparator As String = nfi.CurrencyDecimalSeparator
' Form regular expression pattern.
Dim pattern As String = Regex.Escape(CStr(IIf(symbolPrecedesIfPositive, currencySymbol, ""))) + _
"\s*[-+]?" + "([0-9]{0,3}(" + groupSeparator + "[0-9]{3})*(" + _
Regex.Escape(decimalSeparator) + "[0-9]+)?)" + _
CStr(IIf(Not symbolPrecedesIfPositive, currencySymbol, ""))
Console.WriteLine("The regular expression pattern is: ")
Console.WriteLine(" " + pattern)
' Get text that matches regular expression pattern.
Dim matches As MatchCollection = Regex.Matches(input, pattern, RegexOptions.IgnorePatternWhitespace)
Console.WriteLine("Found {0} matches. ", matches.Count)
' Get numeric string, convert it to a value, and add it to List object.
Dim expenses As New List(Of Decimal)
For Each match As Match In matches
expenses.Add(Decimal.Parse(match.Groups.Item(1).Value))
Next
' Determine whether total is present and if present, whether it is correct.
Dim total As Decimal
For Each value As Decimal In expenses
total += value
Next
If total / 2 = expenses(expenses.Count - 1) Then
Console.WriteLine("The expenses total {0:C2}.", expenses(expenses.Count - 1))
Else
Console.WriteLine("The expenses total {0:C2}.", total)
End If
End Sub
End Module
' The example displays the following output:
' The regular expression pattern is:
' \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?)
' Found 6 matches.
' The expenses total $81.58.
Di komputer yang budayanya saat ini adalah Bahasa Inggris - Amerika Serikat (id-ID), contohnya secara dinamis membangun ekspresi reguler \$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?)
. Pola ekspresi reguler dapat ditafsirkan sebagai berikut:
Pola | Interpretasi |
---|---|
\$ |
Cari satu kemunculan simbol dolar ($ ) dalam string input. String pola ekspresi reguler menyertakan garis miring terbalik untuk menunjukkan bahwa simbol dolar akan ditafsirkan secara harfiah daripada sebagai jangkar ekspresi reguler. Simbol $ saja akan menunjukkan bahwa mesin ekspresi reguler harus mencoba memulai kecocokannya di akhir string. Untuk memastikan bahwa simbol mata uang budaya saat ini tidak disalahartikan sebagai simbol ekspresi reguler, contoh memanggil Regex.Escape metode untuk menghindari karakter. |
\s* |
Cari nol atau beberapa kemunculan karakter spasi putih. |
[-+]? |
Cari nol atau satu kemunculan tanda positif atau negatif. |
([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?) |
Tanda kurung luar mendefinisikan ekspresi ini sebagai grup penangkapan atau subekspresi. Jika kecocokan ditemukan, informasi tentang bagian string yang cocok ini dapat diambil dari objek kedua Group dalam objek yang GroupCollection dikembalikan oleh Match.Groups properti. Elemen pertama dalam koleksi mewakili seluruh kecocokan. |
[0-9]{0,3} |
Cari nol hingga tiga kemunculan digit desimal 0 hingga 9. |
(,[0-9]{3})* |
Cari nol atau beberapa kemunculan pemisah grup diikuti oleh tiga digit desimal. |
\. |
Cari satu kemunculan pemisah desimal. |
[0-9]+ |
Cocokkan satu atau beberapa angka desimal. |
(\.[0-9]+)? |
Cari nol atau satu kemunculan pemisah desimal diikuti oleh setidaknya satu digit desimal. |
Jika setiap subpattern ditemukan dalam string input, kecocokan berhasil, dan Match objek yang berisi informasi tentang kecocokan ditambahkan ke MatchCollection objek.
Artikel terkait
Judul | Deskripsi |
---|---|
Bahasa Regex - Referensi Cepat | Menyediakan informasi tentang sekumpulan karakter, operator, dan konstruksi yang dapat Anda gunakan untuk mendefinisikan regex. |
Model Objek Ekspresi Reguler | Menyediakan informasi dan contoh kode yang menggambarkan cara menggunakan kelas ekspresi reguler. |
Detail Perilaku Ekspresi Reguler | Menyediakan informasi tentang kemampuan dan perilaku ekspresi reguler .NET. |
Menggunakan ekspresi reguler dalam Visual Studio |