Referensi kembali mengacu pada mereferensikan grup yang cocok ke tempat lain dalam ekspresi itu sendiri. Misalnya, saat mencocokkan tag HTML, kita mencocokkan <a>, dan kita perlu mengutip a yang cocok untuk menemukan </ a>, kali ini Anda memerlukannya. untuk menggunakan referensi balik.
Sintaks
a. Untuk mereferensikan kembali grup bernomor, sintaksnya adalah nomor
b. Untuk mereferensikan kembali grup bernama, sintaksnya adalah k<nama>
Contoh
a. Cocokkan tag HTML berpasangan
@"<(?<tag>[^ s>]+)[^>]*>.*</k<tag>>"
b. Mencocokkan dua karakter yang tumpang tindih
public static void Main()
{
string s = "aabbc11asd";
Regex reg = Regex baru(@"(w)1");
Pertandingan MatchCollection = reg.Matches(s);
foreach(Cocokkan m dalam pertandingan)
Console.WriteLine(m.Value);
Konsol.ReadLine();
}
Hasil yang dikembalikan adalah aa bb 11
grup pencocokan bantu
yang mengikuti beberapa struktur grup, Pola dalam tanda kurung tidak akan disimpan sebagai bagian dari hasil pencocokan
1.
Arti dari pernyataan positif (?=): pola dalam tanda kurung harus muncul di sisi kanan pernyataan, tetapi bukan sebagai bagian dari kecocokan
public static void Main()
{
string s = "C#.net,VB.net,PHP,Java,JScript.net";
Regex reg = Regex baru(@"[w#]+(?=.net)",RegexOptions.Compiled);
MatchCollection mc = reg.Matches(s);
foreach(Cocokkan m di mc)
Console.WriteLine(m.Value);
Konsol.ReadLine();
//Keluaran C# VB JScript
}
Anda dapat melihat bahwa mesin pencocokan memerlukan pencocokan .net, tetapi tidak memasukkan .net dalam hasil pencocokan.
2. Deklarasi negatif (?!)
artinya: pola dalam tanda kurung tidak boleh muncul di sisi kanan
deklarasi contoh berikut menunjukkan cara mendapatkan < a>Semua konten dalam pasangan tag, meskipun berisi tag HTML lain.
kekosongan statis publik Utama()
{
string newsContent = @"url:<a href=""1.html""><img src=""1.gif"">test<span style=""color:red;"">Regex</span> </a>.";
Regex regEnd = Regex baru(@"<s*a[^>]*>([^<]|<(?!/a))*<s*/as*>",RegexOptions.Multiline) ;
Konsol.WriteLine(regEnd.Match(newsContent).Value);
//Hasil: <a href="1.html"><img src="1.gif">test<span style="color:red;">Regex</span></a>
Konsol.ReadLine();
}
3.
Arti deklarasi positif terbalik (?<=): pola dalam tanda kurung harus muncul di sisi kiri deklarasi, tetapi tidak sebagai bagian dari pencocokan
4. Arti deklarasi negatif terbalik (?<!)
: pola dalam tanda kurung tidak boleh Sintaks
pencocokan non-backtracking
muncul di sisi kiri pernyataan: (?>)
Arti: Setelah grup ini dicocokkan, karakter yang cocok tidak dapat digunakan untuk mencocokkan ekspresi selanjutnya melalui backtracking. Haha, saya pasti tidak akan memahaminya hanya dengan membaca kalimat ini. Saya menghabiskan banyak waktu untuk mencoba memahaminya, jadi mari kita ilustrasikan melalui sebuah contoh:
" www.csdn.net " dapat dicocokkan dengan @"w+.(.*).w+", tetapi tidak dapat dicocokkan dengan @"w+.(?>.*).w+"! Mengapa?
Alasannya adalah pencocokan reguler itu serakah. Saat mencocokkan, itu akan mencocokkan hasil sebanyak mungkin. Oleh karena itu, .* dalam dua ekspresi reguler pada contoh di atas akan sepenuhnya cocok dengan csdn.net di Ketika mulai mencocokkan, ia menemukan bahwa .w+ tidak memiliki karakter yang cocok, sehingga akan mundur. Yang disebut backtracking adalah untuk mendorong kembali hasil pencocokan .*, dan karakter yang tersisa dari pushback digunakan untuk mencocokkan. .w+ ,Sampai .w+ berhasil cocok, seluruh ekspresi mengembalikan hasil pencocokan yang berhasil. Ekspresi kedua menggunakan pencocokan non-backtracking, jadi setelah .* dicocokkan, ekspresi tersebut tidak diperbolehkan untuk mencocokkan .w+ melalui backtracking, sehingga seluruh ekspresi gagal untuk dicocokkan.
Harap dicatat bahwa backtracking adalah pemborosan sumber daya, jadi cobalah untuk menghindari backtrack agar berhasil mencocokkan ekspresi reguler Anda. Seperti pada contoh di atas, Anda dapat menggantinya dengan @"w+.([^.]+ .)+w+"+".