Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Menggunakan Ungkapan Biasa untuk Memadankan Hanya Tanda Kurung Seimbang dalam Rentetan?

Bagaimanakah Saya Boleh Menggunakan Ungkapan Biasa untuk Memadankan Hanya Tanda Kurung Seimbang dalam Rentetan?

Linda Hamilton
Lepaskan: 2025-01-16 15:27:10
asal
835 orang telah melayarinya

How Can I Use Regular Expressions to Match Only Balanced Parentheses in a String?

Petua Ungkapan Biasa: Padanan Sempurna bagi Tanda Kurung Seimbang

Dalam dunia pengaturcaraan, kurungan seimbang adalah penting untuk memastikan integriti kod. Ekspresi biasa (RegEx) menyediakan mekanisme yang berkuasa untuk mengenal pasti dan mengesahkan pasangan kurungan seimbang. Walau bagaimanapun, mencipta ungkapan biasa yang sepadan dengan kurungan seimbang dengan tepat boleh menjadi tugas yang rumit.

Pertimbangkan ungkapan biasa berikut:

<code>func([a-zA-Z_][a-zA-Z0-9_]*)\(.*\)</code>
Salin selepas log masuk

Ungkapan ini direka bentuk untuk memadankan rentetan "funcPow((3),2) * (9 1)". Sebaik-baiknya, ia hanya perlu memilih "funcPow((3),2)"; namun, pada masa ini ia menangkap segala-galanya sehingga kurungan penutup terakhir, menyebabkan perlawanan tidak seperti yang diharapkan.

Penyelesaian untuk padanan seimbang:

Menyelesaikan masalah ini memerlukan pelaksanaan yang lebih maju yang memanfaatkan kuasa ungkapan biasa - menangkap pemadaman. Ungkapan yang diubah suai berikut menunjukkan cara untuk mencapai padanan kurungan seimbang:

<code>var r = new Regex(@"
    func([a-zA-Z_][a-zA-Z0-9_]*) # 函数名

    \(                      # 开括号
        (?:                 
        [^()]               # 匹配所有非括号字符
        |
        (?<open> \( )       # 匹配'(', 并捕获到名为'open'的组中
        |
        (?<-open> \) )      # 匹配')', 并删除'open'组中的相应捕获
        )+
        (?(open)(?!))       # 如果'open'堆栈不为空,则匹配失败

    \)                      # 闭括号
", RegexOptions.IgnorePatternWhitespace);</code>
Salin selepas log masuk

Penjelasan subkumpulan padanan seimbang:

Kunci kepada kurungan seimbang terletak pada subkumpulan berikut:

  • (? ( ): Tangkap kurungan pembukaan ke dalam kumpulan penangkap bernama yang dipanggil "terbuka".
  • (?<-open> ) ): Memadankan kurungan penutup dan mengalih keluar tangkapan "terbuka" yang sepadan.

Tiada klausa menangkap: (?(terbuka)(?!))

Ungkapan bersyarat ini digunakan sebagai mekanisme keselamatan sekiranya tangkapan "terbuka" tidak kosong. Jika tangkapan "terbuka" masih ada, yang bermaksud terdapat kurungan terbuka yang tidak dapat dipadankan, pemadanan ungkapan gagal.

Dengan menggabungkan teknik ini, anda boleh mencipta ungkapan biasa yang padan dengan tepat kurungan seimbang dan mengembalikan padanan yang diingini:

<code>"funcPow((3),2)"</code>
Salin selepas log masuk

Kuasai ciri lanjutan ungkapan biasa ini dan anda boleh menyelesaikan cabaran pemprosesan rentetan yang kompleks seperti kurungan seimbang dengan elegan dan cekap.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Ungkapan Biasa untuk Memadankan Hanya Tanda Kurung Seimbang dalam Rentetan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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