


Corak rekursi di PCRE untuk menghuraikan struktur bersarang
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 (?
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.

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:

-
(?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)
.

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 = '/\ {(?: [^{}] | \ {(? r) \})*\}/'; preg_match (corak $, '{a {b} c}', $ 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!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

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

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

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

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

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

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

USEPREG_RAPLOPSIMPLEPATTERNSWITHSWITHSTREPEMENTSORBackReferences.2.USEPREG_RAPLEP

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.

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

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.
