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
460 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!

sumber: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