Padankan Kurungan Bersarang Tanpa Rekursi atau Kumpulan Pengimbang
Cabaran:
Padankan satu set kurungan bersarang secara sewenang-wenangnya menggunakan perisa regex yang tidak mempunyai sokongan kumpulan rekursi dan pengimbangan, seperti java.util.regex Java, menangkap tiga kumpulan luar dalam rentetan yang diberikan:
(F(i(r(s)t))) ((S)(e)((c)(o))(n)d) (((((((Third)))))))
Penyelesaian: Majukan Rujukan kepada the Rescue
Bertentangan dengan kepercayaan umum, padanan kurungan bersarang tanpa ciri lanjutan ini boleh dilakukan menggunakan rujukan hadapan:
(?=\()(?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)
Pecahkan:
Reex kompleks ini beroperasi dalam dua peringkat:
Cara Ia Berfungsi:
Varian Padanan Kumpulan Dalam:
Untuk memadankan kumpulan dalam, strateginya tetap sama, tetapi kumpulan penangkap digunakan untuk menyimpan kandungan yang dipadankan dalam sepasang kurungan yang seimbang:
(?=\()(?=((?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)))
Kerosakan Komprehensif:
Jadual meringkaskan komponen dan kefungsian regex:
Note | Component | Description |
---|---|---|
(?=() | Look for '(' | |
(?: | Start group for iteration | |
(?=.?((?!.?1)) | Look for '(' not followed by 1, which contains the matched inner content | |
(.)(?!.2).*)) | Capture inner content and check for at least one more ')' | |
(?=.?)(?!.?3)) | Look for ')' not followed by 2, which contains the matched outer content | |
(. ) | Capture outer content | |
. | Consume a character | |
) | Close group | |
? | Match as few times as possible | |
.*?(?=1) | Match up to and including the last '(' | |
1*(?=2$) | Match up to the last ')' without encountering more '(' |
Atas ialah kandungan terperinci Bagaimana Memadankan Kurungan Bersarang Tanpa Kumpulan Ulangan atau Pengimbangan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!