Rumah  >  Artikel  >  Java  >  Bolehkah Kurung Bersarang Dipadankan Tanpa Rekursi atau Kumpulan Pengimbang?

Bolehkah Kurung Bersarang Dipadankan Tanpa Rekursi atau Kumpulan Pengimbang?

Patricia Arquette
Patricia Arquetteasal
2024-10-24 12:25:02956semak imbas

Can Nested Brackets Be Matched Without Recursion or Balancing Groups?

Memadankan Kurung Bersarang Tanpa Rekursi atau Mengimbangi Kumpulan

Memadankan kurungan bersarang menggunakan ungkapan biasa boleh terbukti mencabar, terutamanya dalam bahasa seperti Java, di mana rekursi dan kumpulan pengimbang tidak disokong. Mujurlah, adalah mungkin untuk mengatasi had ini menggunakan rujukan hadapan.

Padanan Kumpulan Luar

Reeks berikut [1] sepadan dengan kumpulan luar kurungan tanpa mengenakan had kedalaman:

(?=\()(?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)

Di sini, ungkapan memandang ke hadapan untuk membuka kurungan, mengecualikan kurungan pembukaan yang tidak sepadan dan menangkap kurungan penutup yang sepadan. Subrentetan yang ditangkap, walaupun tidak berguna, berfungsi sebagai pemegang tempat untuk melengkapkan perlawanan.

Padanan Kumpulan Dalam

Untuk memasukkan kumpulan dalam, kita boleh menangkap ungkapan berikut [2]:

(?=\()(?=((?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$))) 

Dengan menambahkan kumpulan penangkap dan melaraskan indeks rujukan belakang, ungkapan ini juga menangkap kumpulan dalaman.

Cara Ia Berfungsi

Kaedah berulang melalui rentetan, memadankan kurungan pembukaan dan penutup seterusnya sambil menangkap rentetan yang tinggal dalam setiap kes. Pandangan di hadapan memastikan bahawa kurungan sepadan dengan cara yang seimbang.

Ungkapan itu dibina seperti berikut:

Component Description
(?=() Asserts that '(' precedes complex parsing
(?: Start of non-capturing group for repeated string processing
(?= Assert that the next '(' follows
.?((?!.?1) Match until the next '(' not followed by group 1
(.)(?!.2).* Fill group 1 with the string, ensuring another ')' exists
) Assert that the matching ')' is valid
.?)(?!.?2) Assert that the next ')' not followed by group 2 exists
(.*) Fill group 2 with the remaining string
) Assert that the matching ')' is valid
Consume a single character to continue matching within the group
) ? Repeat the group (in the inner loop)
.*?(?=1) Match up to and including the last '(' found
1*(?=2$) Match up to the last ')' (but within the valid group)

Kaedah ini membolehkan pemadanan kurungan bersarang yang cekap tanpa memerlukan kumpulan rekursi atau pengimbangan.


  1. (

Atas ialah kandungan terperinci Bolehkah Kurung Bersarang Dipadankan 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