Ungkapan biasa ialah formula logik untuk operasi rentetan Ia merupakan teknologi yang penting dan kompleks semasa memproses data teks. Jadi bagaimana untuk menguasai ungkapan biasa dengan cepat? Artikel berikut mengesyorkan kaedah pembelajaran: melalui AST. Semoga ia membantu semua orang!
Ungkapan biasa pada asasnya digunakan untuk memproses rentetan Sangat mudah digunakan untuk pemadanan rentetan, pengekstrakan, penggantian, dsb.
Walau bagaimanapun, mempelajari ungkapan biasa masih agak sukar, seperti konsep seperti padanan tamak, padanan tidak tamak, menangkap subkumpulan dan subkumpulan bukan menangkap Ia bukan sahaja sukar untuk difahami oleh pemula, tetapi juga untuk ramai orang yang telah bekerja selama beberapa tahun tidak faham.
Bagaimana untuk mempelajari ungkapan biasa dengan lebih baik? Bagaimana untuk menguasai ungkapan biasa dengan cepat?
Saya mengesyorkan cara untuk mempelajari ungkapan biasa yang saya rasa sangat bagus: Belajar melalui AST.
Prinsip padanan ungkapan biasa adalah untuk menghuraikan rentetan corak ke AST, dan kemudian gunakan AST ini untuk memadankan rentetan sasaran.
Pelbagai maklumat dalam rentetan corak akan disimpan dalam AST selepas dihuraikan. AST ialah pokok sintaks abstrak Seperti namanya, ia adalah pokok yang disusun mengikut struktur tatabahasa Dari struktur AST, anda boleh mengetahui sintaks yang disokong oleh ungkapan biasa.
Bagaimana untuk melihat AST bagi ungkapan biasa?
Anda boleh melihatnya secara visual melalui tapak web astexplorer.net:
Tukar bahasa parse kepada RegExp, dan anda boleh lakukan ungkapan biasa Visualisasi AST sesuatu ungkapan.
Seperti yang dinyatakan sebelum ini, AST ialah pokok yang disusun mengikut tatabahasa, jadi pelbagai tatabahasa boleh disusun dengan mudah daripada strukturnya.
Kemudian mari kita pelajari pelbagai sintaks dari perspektif AST:
Mari kita mulakan dengan yang mudah, /abc/ Ungkapan biasa boleh sepadan rentetan 'abc', dan ASTnya adalah seperti berikut:
3 Aksara, nilainya ialah a, b, c dan jenisnya mudah. Padanan seterusnya adalah untuk melintasi AST dan memadankan ketiga-tiga aksara ini masing-masing.
Kami mengujinya menggunakan exec api:
Elemen ke-0 ialah rentetan yang dipadankan dan indeks ialah indeks permulaan rentetan yang dipadankan. input ialah rentetan input.
Mari cuba aksara khas sekali lagi:
/ddd/ bermaksud memadankan tiga nombor, d ialah metacharacter dengan makna istimewa yang disokong oleh ungkapan biasa (meta char) .
Kita juga boleh lihat daripada AST bahawa walaupun mereka juga Char, jenis mereka memang meta:
Anda boleh memadankan sebarang nombor melalui metacharacter d :
Yang mana meta char dan mana yang simple char boleh dilihat sepintas lalu melalui AST.
Sokongan biasa yang menentukan set aksara melalui [], yang bermaksud ia boleh memadankan mana-mana aksara.
Kita juga dapat melihat dari AST bahawa ia dibalut dengan lapisan CharacterClass, yang bermaksud kelas watak, iaitu, ia boleh memadankan mana-mana aksara yang terkandung di dalamnya.
Ini memang berlaku dalam ujian:
Ungkapan biasa menyokong menyatakan berapa kali aksara tertentu diulang, menggunakan bentuk {from,to},
Contohnya, /b{1,3}/ bermaksud aksara b diulang 1 hingga 3 kali, /[abc] {1,3}/ bermakna kelas aksara a/b/c ini diulang 1 hingga 3 kali.
Seperti yang dapat dilihat daripada AST, sintaks ini dipanggil Pengulangan:
Ia mempunyai atribut pengkuantiti untuk mewakili pengkuantiti, dan jenis di sini ialah julat , dari 1 hingga 3.
Regular juga menyokong singkatan beberapa pengkuantiti, seperti 1 hingga tak terkira banyaknya, * 0 hingga tak terkira banyaknya, 0 atau 1 kali.
ialah jenis pengkuantiti yang berbeza:
Sesetengah pelajar mungkin bertanya, apakah maksud sifat tamak di sini?
tamak bermaksud tamak Sifat ini menunjukkan sama ada Ulangan ini adalah perlawanan tamak atau tidak tamak.
Jika anda menambah ? selepas pengkuantiti, anda akan mendapati bahawa tamak menjadi palsu, yang bermaksud beralih kepada padanan tidak tamak:
Kemudian tamak dan Apakah maksud tidak tamak?
Mari kita lihat contoh.
Padanan Ulangan lalai adalah tamak dan akan terus sepadan selagi syarat dipenuhi, jadi acbac boleh dipadankan di sini.
Tambahkan ? selepas pengkuantiti untuk bertukar kepada tidak tamak, dan hanya yang pertama akan dipadankan:
Ini adalah padanan tamak dan bukan- Padanan tamak. Melalui AST, kita dapat mengetahui dengan jelas bahawa tamak dan tidak tamak adalah untuk tatabahasa yang diulangi.
Ungkapan biasa menyokong pengembalian sebahagian daripada rentetan yang dipadankan ke dalam subkumpulan melalui ().
Lihat melalui AST:
AST yang sepadan dipanggil Kumpulan.
Dan anda akan mendapati ia mempunyai atribut penangkapan, yang lalai kepada benar:
Apakah maksud ini?
Ini ialah sintaks untuk tangkapan subkumpulan.
Jika anda tidak mahu menangkap subkumpulan, anda boleh menulis (?:aaa)
Lihat, menangkap menjadi palsu.
Apakah perbezaan antara tangkapan dan bukan tangkapan?
Mari cuba:
Oh, ternyata atribut penangkapan Kumpulan mewakili sama ada untuk mengekstrak atau tidak.
Kita dapat melihat daripada AST bahawa tangkap adalah untuk subkumpulan lalai adalah tangkapan, yang bermaksud kandungan subkumpulan diekstrak Anda boleh bertukar kepada bukan tangkap melalui ?: dan ia tidak akan diekstrak Kandungan subkumpulan telah hilang.
Kami sudah biasa menggunakan AST untuk memahami tatabahasa biasa Mari kita lihat sesuatu yang lebih sukar:
Ungkapan biasa Formula menyokong sintaks (?=xxx) untuk menyatakan pernyataan pandangan ke hadapan, yang digunakan untuk menentukan sama ada rentetan tertentu didahului oleh rentetan tertentu.
Anda boleh melihat melalui AST bahawa sintaks ini dipanggil Penegasan, dan jenisnya memandang ke hadapan, iaitu, memandang ke hadapan, hanya sepadan dengan makna sebelumnya:
Ini Apa maksudnya? Mengapa anda menulis ini? Apakah perbezaan antara /bbb(ccc)/ dan /bbb(?:ccc)/?
Mari cuba:
Seperti yang dapat dilihat daripada keputusan:
/bbb(ccc)/ sepadan dengan subkumpulan ccc dan Subkumpulan ini telah diekstrak kerana subkumpulan lalai ditangkap.
/bbb(?:ccc)/ sepadan dengan subkumpulan ccc tetapi tidak diekstrak kerana kami menetapkan subkumpulan untuk tidak menangkap melalui ?: .
/bbb(?=ccc)/ Ccc padanan subkumpulan belum diekstrak, menunjukkan bahawa ia juga tidak menangkap. Perbezaan antaranya dan ?: ialah ccc tidak muncul dalam hasil padanan.
Ini ialah sifat penegasan pandang ke hadapan: Penegasan pandangan ke hadapan bermakna rentetan tertentu didahului oleh rentetan tertentu, subkumpulan yang sepadan tidak ditangkap dan rentetan yang ditegaskan tidak akan muncul dalam hasil yang sepadan.
Ia tidak akan sepadan jika tidak diikuti oleh rentetan itu:
Selepas menukar ?= kepada ?!, maknanya berubah Lihat melalui AST:
Walaupun penegasan pandangan hadapan masih ditegaskan dahulu, terdapat atribut negatif tambahan. daripada benar.
Maksudnya sangat jelas pada asalnya, ia bermaksud bahawa bahagian depan adalah rentetan tertentu.
Kemudian hasil padanan adalah sebaliknya:
Kini ia akan sepadan hanya jika rentetan sebelumnya bukan rentetan tertentu Ini adalah pandangan negatif penegasan.
Sekiranya terdapat penegasan sebelumnya, secara semula jadi akan ada penegasan tertinggal, iaitu, ia akan sepadan hanya jika ia diikuti oleh rentetan tertentu.
Begitu juga, ia juga boleh dinafikan:
(?
(?
Penegasan pandang ke hadapan dan penegasan pandang belakang ialah sintaks ungkapan biasa yang paling sukar untuk difahami jika anda mempelajarinya melalui AST~
Sintaks pengulangan (Pengulangan) ialah bentuk pengkuantiti aksara Lalainya ialah padanan tamak (tamak adalah benar), yang bermaksud padanan sehingga tiada padanan Setakat ini, tambahkan ? selepas pengkuantiti untuk bertukar kepada padanan tidak tamak, dan berhenti apabila satu aksara dipadankan.
Sintaks subkumpulan (Kumpulan) digunakan untuk mengekstrak rentetan tertentu Lalai ialah menangkap (menangkap adalah benar), yang bermaksud pengekstrakan diperlukan melalui (?: xxx) Tidak menangkap, hanya padanan tanpa pengekstrakan.
Sintaks penegasan (Assertion) mewakili bahawa terdapat rentetan tertentu sebelum atau selepasnya, yang dibahagikan kepada penegasan pandang hadapan dan penegasan pandang belakang Sintaksnya ialah (?= xxx) dan (?
Adakah pemahaman mendalam sintaks dalam pelbagai dokumen atau pemahaman mendalam sintaks dalam pengkompil? Tak payah tanya, mesti penyusunnya! Sememangnya lebih baik untuk mempelajari tatabahasa melalui pepohon sintaks yang dihuraikan mengikut tatabahasa daripada dokumen. Perkara yang sama berlaku untuk ungkapan biasa, dan perkara yang sama berlaku untuk mempelajari tatabahasa lain Jika anda boleh mempelajari tatabahasa menggunakan AST, anda tidak perlu membaca dokumentasi. Untuk lebih banyak pengetahuan berkaitan nod, sila lawati:tutorial nodejs!
Atas ialah kandungan terperinci Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!