Memadankan Kurungan Bersarang Tanpa Rekursi atau Mengimbangi Kumpulan
Cabaran:
Boleh ekspresi regex, seperti yang ada dalam java.util.regex Java, padankan kurungan bersarang sewenang-wenangnya tanpa bergantung pada kumpulan rekursi atau pengimbangan?
Penyelesaian:
Ya, boleh menggunakan rujukan hadapan:
(?=\()(?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)
Cara Ia Berfungsi:
Ungkapan ini terdiri daripada beberapa pandangan ke hadapan dan rujukan ke hadapan yang bekerjasama untuk mengenal pasti kumpulan kurungan bersarang:
Contoh:
Rentetan berikut akan memadankan tiga kumpulan bersarang:
(F(i(r(s)t))) ((S)(e)((c)(o))(n)d) (((((((Third)))))))
Padanan Kumpulan Dalaman:
Untuk memadankan kumpulan dalam, kumpulan penangkap boleh ditambah hingga akhir ungkapan:
(?=\()(?=((?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)))
Atas ialah kandungan terperinci Bolehkah Regex Memadankan Kurungan Bersarang Tanpa Rekursi atau Kumpulan Pengimbang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!