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
Lepaskan: 2024-10-25 02:37:02
asal
538 orang telah melayarinya

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:

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

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

Padanan Kumpulan Dalaman:
Untuk memadankan kumpulan dalam, kumpulan penangkap boleh ditambah hingga akhir ungkapan:

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

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan