Rumah >pembangunan bahagian belakang >C++ >Bolehkah Ungkapan Biasa Mengimbangi Tanda Kurung dengan Berkesan?

Bolehkah Ungkapan Biasa Mengimbangi Tanda Kurung dengan Berkesan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-16 14:48:11903semak imbas

Can Regular Expressions Effectively Balance Parentheses?

Menggunakan Ungkapan Biasa untuk Mengesahkan Tanda Kurung Seimbang

Walaupun ungkapan biasa berkuasa, mengimbangi kurungan dengan sempurna hanya menggunakan regex sememangnya sukar. Walau bagaimanapun, kita boleh mencipta regex yang berkesan mengesahkan kurungan seimbang dalam konteks tertentu. Pendekatan berikut menunjukkan kaedah:

Regex untuk Pengesahan Kurungan:

<code>func([a-zA-Z_][a-zA-Z0-9_]*) # Function name

\(                      # Opening parenthesis
    (?:                 
    [^()]               # Match any character except parentheses
    |
    (?<open> \( )       # Match opening parenthesis, add to 'open' stack
    |
    (?<-open> \) )      # Match closing parenthesis, remove from 'open' stack
    )+
    (?(open)(?!))       # Fails if 'open' stack is not empty
\)                      # Closing parenthesis</code>

Cara ia Berfungsi:

Reex ini memanfaatkan kumpulan pengimbangan (tersedia dalam banyak enjin regex, tetapi bukan semua).

  • Kumpulan Tangkapan Dinamakan: (?<open> ( ) dan (?<-open> ) ) gunakan kumpulan tangkapan bernama. (?<open> ...) menambah kurungan pembukaan yang dipadankan pada timbunan bernama "terbuka". (?<-open> ...) mengalih keluar kurungan penutup yang sepadan daripada tindanan "terbuka".
  • Semakan Bersyarat: (?(open)(?!)) ialah ungkapan bersyarat. Ia menyemak sama ada timbunan "terbuka" kosong. Jika ia tidak kosong (tanda kurungan tidak seimbang), keseluruhan perlawanan gagal.

Contoh:

Diberi rentetan input: "test -> funcPow((3),2) * (9 1)"

Reeks mengecam dengan betul "funcPow((3),2)" sebagai ungkapan kurungan yang seimbang. Ia akan tidak sepadan dengan "funcPow((3),2) * (9 1) kerana kurungan luar tidak seimbang.

Had:

regex ini hanya berfungsi untuk kurungan yang berkaitan secara langsung dengan panggilan fungsi (seperti yang ditakrifkan oleh func([a-zA-Z_][a-zA-Z0-9_]*)). Panggilan fungsi bersarang dalam kurungan tidak dikendalikan. Untuk mengimbangi kurungan yang benar-benar mantap merentas struktur bersarang yang kompleks, pendekatan berasaskan bukan regex (seperti algoritma berasaskan tindanan) secara amnya diperlukan.

Atas ialah kandungan terperinci Bolehkah Ungkapan Biasa Mengimbangi Tanda Kurung dengan Berkesan?. 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