Rumah >Java >javaTutorial >Bolehkah Regex Memadankan Kurungan Bersarang Tanpa Rekursi atau Kumpulan Pengimbang?

Bolehkah Regex Memadankan Kurungan Bersarang Tanpa Rekursi atau Kumpulan Pengimbang?

Patricia Arquette
Patricia Arquetteasal
2024-10-25 02:37:02536semak imbas

Can Regex Match Nested Brackets Without Recursion or Balancing Groups?

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:

  • (? =() memastikan watak seterusnya ialah kurungan pembuka.
  • (?:...) ?.*?(?=...): Kumpulan bukan menangkap yang berulang melalui rentetan.
  • (?=.*?((?!.*?1): Pandang ke hadapan untuk mencari kurungan pembukaan seterusnya yang bukan sebahagian daripada kumpulan yang telah dipadankan (ditawan dalam 1).
  • (.*)(?!.*2).*): Menangkap selebihnya rentetan dan sepadan dengan sekurang-kurangnya satu kurungan penutup tambahan.
  • (?=.*?)(?!.*?2 ): Pandang ke hadapan untuk mencari kurungan penutup seterusnya yang bukan sebahagian daripada kumpulan yang telah dipadankan (ditangkap dalam 2).
  • .*?(?=1): Padanan sehingga dan termasuk kurungan pembukaan terakhir ditemui .
  • [^(]*(?=2$): Padanan sehingga kurungan penutup terakhir ditemui, memastikan tiada lagi kurungan pembuka di antara mereka.

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!

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