Rumah > Java > javaTutorial > teks badan

Bolehkah Kurung Bersarang Dipadankan Tanpa Rekursi atau Kumpulan Pengimbang?

Patricia Arquette
Lepaskan: 2024-10-24 12:25:02
asal
956 orang telah melayarinya

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:

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

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

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

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!