Rumah >Java >javaTutorial >Bagaimana Memadankan Kurungan Bersarang Tanpa Kumpulan Ulangan atau Pengimbangan?

Bagaimana Memadankan Kurungan Bersarang Tanpa Kumpulan Ulangan atau Pengimbangan?

DDD
DDDasal
2024-10-25 02:35:02467semak imbas

How to Match Nested Brackets Without Recursion or Balancing Groups?

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:

  • Peringkat 1: Pandangan hadapan mengenal pasti urutan kurungan seimbang tanpa menggunakan aksara. Proses ini berterusan sehingga kumpulan luar yang lengkap ditemui.
  • Peringkat 2: Kumpulan penangkap mengekstrak kandungan kumpulan luar yang dipadankan.

Cara Ia Berfungsi:

  • Menyemak '(': Maju melalui rentetan sehingga '(' ditemui.
  • Padanan Tanda Kurung Seimbang: Gunakan dua pandangan ke hadapan untuk memastikan '(' dan ')' seterusnya dipadankan dengan cara yang seimbang, menangkap kandungan dalaman.
  • Semakan Kurungan Penutup: Semak untuk penutup ')' yang sepadan dengan '(' yang dipadankan sebelum ini dan maju lebih jauh.
  • Semakan Akhir-Outer-Group: Pastikan tiada lagi '(' muncul sebelum penutupan ' )' kumpulan luar.

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 '('

  1. (

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn