Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

青灯夜游
Lepaskan: 2022-03-09 20:13:59
ke hadapan
2144 orang telah melayarinya

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!

Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

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:

Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

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:

/abc/

Mari kita mulakan dengan yang mudah, /abc/ Ungkapan biasa boleh sepadan rentetan 'abc', dan ASTnya adalah seperti berikut:

Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

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:

Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

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/

/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:

Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

Anda boleh memadankan sebarang nombor melalui metacharacter d :

Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

Yang mana meta char dan mana yang simple char boleh dilihat sepintas lalu melalui AST.

/[abc]/

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.

Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

Ini memang berlaku dalam ujian:

Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

/a{1,3}/

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:

Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

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:

Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

Sesetengah pelajar mungkin bertanya, apakah maksud sifat tamak di sini?

Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

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:

1Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

Kemudian tamak dan Apakah maksud tidak tamak?

Mari kita lihat contoh.

1Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

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:

1Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

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.

(aaa)bbb(ccc)

Ungkapan biasa menyokong pengembalian sebahagian daripada rentetan yang dipadankan ke dalam subkumpulan melalui ().

Lihat melalui AST:

1Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

AST yang sepadan dipanggil Kumpulan.

Dan anda akan mendapati ia mempunyai atribut penangkapan, yang lalai kepada benar:

1Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

Apakah maksud ini?

Ini ialah sintaks untuk tangkapan subkumpulan.

Jika anda tidak mahu menangkap subkumpulan, anda boleh menulis (?:aaa)

1Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

Lihat, menangkap menjadi palsu.

Apakah perbezaan antara tangkapan dan bukan tangkapan?

Mari cuba:

1Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

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:

/bbb(?=ccc)/

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:

1Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

Ini Apa maksudnya? Mengapa anda menulis ini? Apakah perbezaan antara /bbb(ccc)/ dan /bbb(?:ccc)/?

Mari cuba:

1Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

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:

Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

/bbb(?!ccc)/

Selepas menukar ?= kepada ?!, maknanya berubah Lihat melalui AST:

2Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa 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:

2Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

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.

2Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

Begitu juga, ia juga boleh dinafikan:

2Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

(?

2Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

(?

2Bagaimana untuk menguasai ungkapan biasa dengan cepat? Belajar tatabahasa biasa melalui AST!

Penegasan pandang ke hadapan dan penegasan pandang belakang ialah sintaks ungkapan biasa yang paling sukar untuk difahami jika anda mempelajarinya melalui AST~

Ringkasan

Ungkapan biasa digunakan untuk memproses rentetan Ia adalah alat yang sangat mudah, tetapi masih agak sukar untuk dipelajari Ramai orang keliru tentang sintaks seperti padanan tamak, padanan tidak tamak, menangkap subkumpulan, subkumpulan tidak menangkap. , dakwaan pandang ke hadapan dan dakwaan pandang belakang.

Saya mengesyorkan mempelajari ungkapan biasa melalui AST ialah pokok objek yang disusun mengikut struktur tatabahasa dengan mudah dapat dijelaskan melalui nama dan atribut nod AST.

Sebagai contoh, kami telah menjelaskannya 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!

Label berkaitan:
sumber:juejin.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan