Jadual Kandungan
Apakah corak rekursif?
Memadankan tanda kurung bersarang
Menggunakan subpattern yang dinamakan untuk kejelasan
Batasan dan pertimbangan praktikal
Kes penggunaan praktikal: Mengekstrak kurungan bersarang
Nota akhir
Rumah pembangunan bahagian belakang tutorial php Corak rekursi di PCRE untuk menghuraikan struktur bersarang

Corak rekursi di PCRE untuk menghuraikan struktur bersarang

Aug 11, 2025 am 11:06 AM
PHP Regular Expressions

Corak rekursif PCRE membolehkan struktur bersarang yang sepadan seperti kurungan atau kurungan menggunakan (? R) atau rujukan yang dinamakan seperti (? & Name), yang membolehkan enjin regex mengendalikan pembinaan seimbang dengan menggunakan corak rekursif; Sebagai contoh, ^$$ ([ ^()] | (? 1)) $$ mencocokkan tanda kurung seimbang sepenuhnya dengan selalunya memadankan bukan parentheses atau rekursif memohon kumpulan melalui (? 1); Begitu juga, menggunakan kumpulan yang dinamakan seperti (? 1 | $$ (& amp; kandungan) $$) meningkatkan kejelasan; Kaedah ini berfungsi dalam enjin patuh PCRE seperti PHP atau Perl tetapi tidak dalam JavaScript atau Python's Re; Penggunaan praktikal termasuk mengekstrak blok bersarang seperti {a {b} c} dengan {(?: 2 | {(? r)})*}; Walau bagaimanapun, batasan termasuk risiko limpahan stack pada bersarang yang mendalam, isu prestasi, dan kekurangan sokongan dalam banyak enjin regex, menjadikannya hanya sesuai untuk bersarang sederhana dan jelas di mana parser penuh tidak perlu.

() ↩ {} ↩

Corak rekursi di PCRE untuk menghuraikan struktur bersarang

Struktur bersarang parsing seperti tanda kurung bersarang, kurungan dalam data seperti JSON, atau tag HTML yang seimbang-adalah cabaran biasa ketika bekerja dengan ekspresi biasa. Walaupun enjin regex tradisional tidak menyokong rekursi yang benar (kerana bahasa biasa tidak dapat mengendalikan struktur bersarang sewenang -wenangnya), PCRE (ekspresi biasa yang serasi PerL) termasuk ciri yang kuat: corak rekursif , yang membolehkan yang sesuai dengan seimbang, bersarang yang melampaui apa yang boleh dilakukan oleh regex asas.

Corak rekursi di PCRE untuk menghuraikan struktur bersarang

Keupayaan ini menjadikan PCRE salah satu daripada beberapa enjin regex (bersama -sama Perl dan beberapa yang lain) yang boleh mengendalikan tugas -tugas tersebut tanpa menggunakan logik parsing luaran.

Apakah corak rekursif?

Di PCRE, rekursi dicapai menggunakan sintaks khas (?R) atau (?n) , di mana:

Corak rekursi di PCRE untuk menghuraikan struktur bersarang
  • (?R) merujuk kepada panggilan rekursif keseluruhan corak.
  • (?n) merujuk kepada panggilan rekursif kumpulan penangkapan n -th.
  • Anda juga boleh menggunakan rujukan yang dinamakan seperti (?&name) untuk kebolehbacaan yang lebih baik.

Ini membolehkan enjin Regex untuk "memanggil sendiri" semasa padanan, membolehkannya turun ke tahap bersarang struktur dan kembali hanya apabila seimbang.

Memadankan tanda kurung bersarang

Contoh klasik adalah sepadan dengan kurungan seimbang. Katakan anda ingin memadankan rentetan seperti (a(b(c)d)e) tetapi menolak yang tidak seimbang seperti ((a) .

Corak rekursi di PCRE untuk menghuraikan struktur bersarang

Inilah regex pcre yang melakukan ini:

 ^
  \ ( # Perlawanan pembukaan kurungan
  ( # Mulakan kumpulan untuk rekursi
    [^()]* # Sepadan dengan mana-mana bukan parenthes
    | # Atau ...
    (? 1) # rekursif sepadan dengan kumpulan yang sama (parens bersarang seimbang)
  )* # Ulangi seperti yang diperlukan
  \) # Perlawanan Pandang Pandangan
$

Mari Pecahkannya:

  • ^ dan $ menambat perlawanan ke seluruh rentetan.
  • Luar \( dan \) sepadan dengan kurungan harfiah.
  • (?1) Adakah rujukan rekursif kepada kumpulan menangkap pertama (dan hanya). Ini adalah kunci -ia membolehkan corak untuk memadankan kurungan bersarang dari mana -mana kedalaman.
  • Kumpulan bergantian antara pemadanan bukan parentheses ( [^()]* ) dan rekursif yang sepadan dengan lebih banyak tanda kurung.

Corak ini akan sepadan:

  • (a)
  • (a(b))
  • (a(b(c)d)e)

Tetapi tidak akan sepadan:

  • (a
  • ((a)
  • ())

Menggunakan subpattern yang dinamakan untuk kejelasan

Untuk corak yang lebih kompleks, menggunakan kumpulan yang dinamakan meningkatkan kebolehbacaan. Inilah contoh yang sama dengan kumpulan bernama:

 ^
  \ ( 
  (? <content>
    [^()]*
    |
    \ ((? & kandungan) \)
  )*
  \)
$
  • (?<content>...) mentakrifkan subpattern bernama.
  • (?&content) memanggilnya secara rekursif.

Ini berkelakuan sama seperti versi bernombor tetapi lebih mudah untuk dikekalkan.

Batasan dan pertimbangan praktikal

Walaupun kekuatannya, PCRE rekursif mempunyai kaveat:

  • Tidak benar-benar parsing bebas konteks : Walaupun rekursi membantu, PCRE regexes masih tidak mempunyai parser penuh. Mereka tidak dapat mengendalikan semua tatabahasa bebas konteks dengan pasti, terutamanya dengan penggantian kompleks atau keadaan sampingan.
  • Had Stack : Bersarang dalam boleh menyebabkan limpahan timbunan. PCRE menggunakan had rekursi (ditetapkan pada masa penyusunan atau melalui pcre_stack_guard ), jadi struktur yang sangat mendalam mungkin gagal.
  • Prestasi : Corak rekursif boleh perlahan pada input panjang atau sangat bersarang. Mereka lebih baik digunakan apabila kedalaman bersarang sederhana.
  • Tidak disokong dalam semua enjin : JavaScript, Python's re , dan banyak enjin Regex lain tidak menyokong rekursi. Gunakan hanya apabila anda mengawal persekitaran (contohnya, PHP dengan PCRE, Perl).

Kes penggunaan praktikal: Mengekstrak kurungan bersarang

Katakan anda ingin mengekstrak kandungan pendakap keriting seimbang paling luar dalam rentetan seperti {a{b}c} .

 \ {
  (?: 
    [^{}]  
    | 
    \ {(? R) \} 
  )* 
\}

Dalam PHP, anda mungkin menggunakan:

 $ corak = &#39;/\ {(?: [^{}] | \ {(? r) \})*\}/&#39;;
preg_match (corak $, &#39;{a {b} c}&#39;, $ padanan);
Echo $ Matches [0]; // output {a {b} c}

Ini mendapati blok seimbang penuh, yang kemudiannya dapat diproses.

Nota akhir

Corak rekursif di PCRE adalah alat yang berkuasa untuk mengendalikan struktur bersarang yang sederhana dan similar apabila parser penuh berlebihan. Mereka sesuai untuk:

  • Mengekstrak ekspresi bersarang dalam bahasa khusus domain.
  • Mengesahkan atau memadankan pembatas seimbang.
  • Pemprosesan teks cepat dalam skrip di mana prestasi dan kedalaman boleh diurus.

Tetapi ingat: jika data anda sangat bersarang, samar -samar, atau sebahagian daripada tatabahasa yang kompleks (seperti HTML atau JSON penuh), gunakan parser yang betul. Regex, walaupun dengan rekursi, bukan pengganti parser.

Bagi yang jelas, bersarang cetek, walaupun, Pcre's (?R) dan (?&name) membuka penyelesaian elegan yang merasa hampir seperti menulis peraturan tatabahasa.

Pada asasnya, ia adalah alat yang tajam -gunakan dengan bijak.

Atas ialah kandungan terperinci Corak rekursi di PCRE untuk menghuraikan struktur bersarang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China 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

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1535
276
Beyond Numeric Captures: Memanfaatkan kumpulan bernama dalam `preg_match` dan` preg_replace` Beyond Numeric Captures: Memanfaatkan kumpulan bernama dalam `preg_match` dan` preg_replace` Aug 04, 2025 pm 03:44 PM

NamedCapturGegroupSinphpprovideAclearandMaintainableWayToExtractMatchedTextBySsigningMeaningFulnamesInsteadofRelyingonNumericindices.1.use (? Corak) atau ('name'pattern) syntaxtodefinamedgroupsinpccer.2

Pengubah `u` yang dilepaskan: menyelam mendalam ke regex unicode-sware dalam php Pengubah `u` yang dilepaskan: menyelam mendalam ke regex unicode-sware dalam php Aug 03, 2025 am 06:39 AM

TheumodifierinphpregexisSessSentialforpoperutf-8andunicodesupport.1.itensurestHepatternandInputstringaretreatedasutf-8, mencegahMisMisinterpretationofmulti-batecharacters.withouter, aksara-aksara

Menguasai Lookaheads dan Lookbehinds untuk Penegasan String Kompleks Menguasai Lookaheads dan Lookbehinds untuk Penegasan String Kompleks Aug 04, 2025 am 06:35 AM

Penegasan positif (? = ...), pernyataan negatif (?! ...), pernyataan positif (??

Corak rekursi di PCRE untuk menghuraikan struktur bersarang Corak rekursi di PCRE untuk menghuraikan struktur bersarang Aug 11, 2025 am 11:06 AM

Pcre'srecursivePatternSenableMatchingNestedStructuresLikeparentHesesorBracketSing (? R) ornamedReference (? & Name), membolehkanTherTexenginetohandlebalanconstructsbyRecursifyPlyShePattern;

Bila hendak menggunakan `preg_replace` vs` preg_replace_callback_array` untuk penggantian kompleks Bila hendak menggunakan `preg_replace` vs` preg_replace_callback_array` untuk penggantian kompleks Aug 08, 2025 pm 06:10 PM

USEPREG_RAPLOPSIMPLEPATTERNSWITHSWITHSTREPEMENTSORBackReferences.2.USEPREG_RAPLEP

Membentuk parser fail log yang mantap dengan php's `preg_match_all` Membentuk parser fail log yang mantap dengan php's `preg_match_all` Aug 03, 2025 am 09:20 AM

Gunakan fungsi preg_match_all untuk bekerjasama dengan ungkapan biasa untuk menghuraikan fail log php dengan cekap. 1. Pertama menganalisis format log seperti CLF Apache; 2. Membina corak biasa dengan kumpulan penangkapan yang dinamakan untuk mengekstrak IP, kaedah, laluan dan bidang lain; 3. Gunakan preg_match_all untuk bekerjasama dengan bendera preg_set_order untuk menghuraikan log berbilang baris dalam kelompok; 4. Mengendalikan kes kelebihan seperti medan yang hilang atau balak silang; 5. Sahkan dan taipkan tukar data yang diekstrak, dan akhirnya menukar log tidak berstruktur ke dalam data array berstruktur untuk pemprosesan selanjutnya.

Taming the Beast: Mengurangkan mundur bencana di PCRE Taming the Beast: Mengurangkan mundur bencana di PCRE Aug 03, 2025 am 07:17 AM

CASTASTROPHICHICBACTTRACKINGOCRSWHENNESTEDGREEDYQuantifiersCauseexponentialBackTrackingonFailedMatches, asin^(a) $ melawan "aaaax" .2.UseatomicGroups (?> (...)

Dari Pengesahan ke Transformasi: Panduan untuk `preg_filter` Dari Pengesahan ke Transformasi: Panduan untuk `preg_filter` Aug 08, 2025 pm 06:37 PM

preg_filter hanya mengembalikan hasil penggantian apabila dipadankan, jika tidak, ia akan kembali null, sesuai untuk senario di mana pengesahan dan penukaran diperlukan; 1. Perbezaan utama di antara itu dan preg_replace adalah bahawa ia mengembalikan null bukannya rentetan asal apabila tidak sepadan; 2. Ia sesuai untuk mengekalkan dan menukar data yang sesuai dengan corak; 3. Apabila pemprosesan array, ia secara automatik menapis unsur -unsur tidak sepadan tetapi mengekalkan nama -nama utama, dan boleh diubah semula dengan array_values; 4. Menyokong backreferences dan prestasi sederhana, sesuai untuk pemprosesan bentuk, penulisan semula URL dan senario lain; 5. Apabila anda perlu menyimpan semua input, anda harus menggunakan preg_replace, sementara dalam senario pengesahan dan penukaran, preg_filter lebih efisien dan ringkas.

See all articles