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

Bagaimana Memadankan Kurungan Bersarang Tanpa Kumpulan Ulangan atau Pengimbangan?

DDD
Lepaskan: 2024-10-25 02:35:02
asal
518 orang telah melayarinya

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)))))))
Salin selepas log masuk

Penyelesaian: Majukan Rujukan kepada the Rescue

Bertentangan dengan kepercayaan umum, padanan kurungan bersarang tanpa ciri lanjutan ini boleh dilakukan menggunakan rujukan hadapan:

(?=\()(?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)
Salin selepas log masuk

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:

(?=\()(?=((?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$))) 
Salin selepas log masuk

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 Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan