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
Linda Hamiltonasal
2025-01-16 15:27:10837semak imbas

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>

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>

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>

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!

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