Rumah > pembangunan bahagian belakang > tutorial php > Demystifying regex dengan contoh praktikal

Demystifying regex dengan contoh praktikal

Jennifer Aniston
Lepaskan: 2025-02-16 12:49:10
asal
885 orang telah melayarinya

Demystifying regex dengan contoh praktikal

Takeaways Key

  • Ekspresi biasa (REGEX) adalah alat yang berharga bagi pemaju, yang digunakan untuk tugas -tugas seperti analisis log, pembentukan pengesahan penyerahan, dan mencari dan menggantikan operasi. Memahami bagaimana untuk membina dan menggunakan Regex dengan berkesan dapat meningkatkan produktiviti dan kecekapan.
  • Membina regex yang baik melibatkan menentukan senario, membangunkan rancangan, dan melaksanakan/menguji/refactoring. Adalah penting untuk memahami jenis watak yang dibenarkan, berapa kali watak mesti muncul, dan apa -apa kekangan untuk diikuti.
  • Contoh praktikal penggunaan regex termasuk memadankan kata laluan, URL, tag HTML tertentu, dan kata -kata yang diduplikasi. Contoh -contoh ini menunjukkan penggunaan julat, pernyataan, keadaan, kumpulan, dan banyak lagi.
  • Walaupun Regex adalah alat yang berkuasa, ia juga boleh menjadi kompleks dan sukar untuk dikendalikan. Oleh itu, kadang -kadang lebih berkesan untuk menggunakan beberapa regex yang lebih kecil dan bukannya satu yang besar. Memberi perhatian kepada penangkapan kumpulan juga boleh membuat perlawanan lebih berguna untuk pemprosesan selanjutnya.
Ekspresi biasa sering digunakan untuk melakukan carian, menggantikan substrings dan mengesahkan data rentetan. Artikel ini menyediakan petua, helah, sumber dan langkah untuk melalui ungkapan biasa yang rumit. Jika anda tidak mempunyai skillet asas di bawah tali pinggang anda, anda boleh belajar Regex dengan panduan pemula kami. Sebagai arcane sebagai ungkapan biasa, ia tidak akan mengambil masa yang lama untuk mempelajari konsep -konsep tersebut. Terdapat banyak buku, artikel, laman web yang menerangkan ungkapan biasa, jadi bukannya menulis penjelasan lain yang saya lebih suka pergi terus ke contoh yang lebih praktikal:
  • memadankan kata laluan
  • memadankan url
  • memadankan tag html tertentu
  • sepadan dengan kata -kata duplikat
Anda boleh mencari lembaran cheat berguna di pautan ini. Bersama dengan pelbagai sumber yang berguna, terdapat juga video persidangan oleh Lea Verou di bahagian bawah jawatan ini - agak lama, tetapi ia sangat baik dalam memecahkan regex.

bagaimana membina regex yang baik

Ekspresi biasa sering digunakan dalam rutin harian pemaju - analisis log, membentuk pengesahan penyerahan, mencari dan menggantikan, dan sebagainya. Itulah sebabnya setiap pemaju yang baik harus tahu cara menggunakannya, tetapi apakah amalan terbaik untuk membina regex yang baik?

1. Tentukan senario

Menggunakan bahasa semulajadi untuk menentukan masalah ini akan memberi anda idea yang lebih baik tentang pendekatan untuk digunakan. Kata -kata boleh dan mesti, digunakan dalam definisi, berguna untuk menggambarkan kekangan atau dakwaan mandatori. Berikut adalah contoh:
  • Rentetan mesti bermula dengan 'H' dan selesai dengan 'O' (mis. Hello, Halo).
  • Rentetan boleh dibalut dengan kurungan.

2. Membangunkan pelan

Setelah mempunyai definisi yang baik tentang masalah ini, kita dapat memahami jenis elemen yang terlibat dalam ekspresi biasa kita:
  • Apakah jenis watak yang dibenarkan (Word, Digit, New Line, Range, ...)?
  • Berapa kali mesti muncul watak (satu atau lebih, sekali, ...)?
  • Adakah terdapat beberapa kekangan untuk diikuti (pilihan, lookahead/belakang, if-then-else, ...)?

3. Melaksanakan/menguji/refactor

Sangat penting untuk mempunyai persekitaran ujian masa nyata untuk menguji dan meningkatkan ekspresi biasa anda. Terdapat laman web seperti regex101.com, regexr.com dan debuggex.com yang menyediakan beberapa persekitaran terbaik. Untuk meningkatkan kecekapan regex, anda boleh cuba menjawab beberapa soalan tambahan ini:
  • Adakah kelas watak ditakrifkan dengan betul untuk domain tertentu?
  • Sekiranya saya menulis lebih banyak rentetan ujian untuk menampung lebih banyak kes penggunaan?
  • Adakah mungkin untuk mencari dan mengasingkan beberapa masalah dan mengujinya secara berasingan?
  • Sekiranya saya refactor ekspresi saya dengan subpatterns, kumpulan, keadaan, dan lain -lain, untuk menjadikannya lebih kecil, lebih jelas dan lebih fleksibel?

Contoh praktikal

Matlamat contoh -contoh berikut bukan untuk menulis ungkapan yang hanya akan menyelesaikan masalah, tetapi untuk menulis ungkapan yang paling berkesan untuk kes -kes penggunaan tertentu, menggunakan unsur -unsur penting seperti rentang aksara, pernyataan, syarat, kumpulan dan sebagainya.

memadankan kata laluan

Demystifying regex dengan contoh praktikal Senario:
  • 6 hingga 12 aksara panjang
  • mesti mempunyai sekurang -kurangnya satu huruf besar
  • mesti mempunyai sekurang -kurangnya satu huruf kes yang lebih rendah
  • mesti mempunyai sekurang -kurangnya satu digit
  • harus mengandungi aksara lain
  • Corak: ^(? =.*[a-z]) (? =.*[a-z]) (? =.*d). {6,12} $ Ekspresi ini didasarkan pada lookahead positif (? = (Regex)). Lookahead sepadan dengan sesuatu yang diikuti oleh yang diisytiharkan (regex). Perintah keadaan tidak menjejaskan hasilnya. Ekspresi lookaround sangat berguna apabila terdapat beberapa syarat. Kita juga boleh menggunakan lookahead negatif (?! (Regex)) untuk mengecualikan beberapa julat watak. Sebagai contoh, saya boleh mengecualikan % dengan (?!*#). Mari kita jelaskan setiap corak ungkapan di atas:
    ^ menegaskan kedudukan pada permulaan rentetan
  1. (? =.*[A-z]) Lookahead positif, menegaskan bahawa regex.*[A-Z] boleh dipadankan:
    • .* Memadankan mana -mana watak (kecuali Newline) antara sifar dan masa tanpa had
    • [a-z] sepadan dengan watak tunggal dalam julat antara a dan z (sensitif kes)
  2. (? =.*[A-z]) Lookahead positif, menegaskan bahawa regex.*[A-Z] boleh dipadankan:
    • .* Memadankan mana -mana watak (kecuali Newline) antara sifar dan masa tanpa had
    • [a-z] sepadan dengan watak tunggal antara a dan z (sensitif kes)
  3. (? =. *D) Lookahead positif, menegaskan bahawa regex *dcan dipadankan:
    • .* Memadankan mana -mana watak (kecuali Newline) antara sifar dan masa tanpa had
    • d sepadan dengan digit [0-9]
  4. . {6,12}Memadankan sebarang watak (kecuali Newline) antara 6 dan 12 kali
  5. $ menegaskan kedudukan pada akhir rentetan

URL yang sepadan

Demystifying regex dengan contoh praktikal Senario:
  • mesti bermula dengan http atau https atau ftp diikuti oleh: //
  • mesti sepadan dengan nama domain yang sah
  • boleh mengandungi spesifikasi port (http://www.sitePoint.com:80)
  • boleh mengandungi digit, huruf, titik, tanda hubung, slash ke hadapan, beberapa kali
Corak: ^(http | https | ftp): [/] {2} ([a-z0-9-.]. [a-za-z] {2,4}) (: [0-9])? /? ([A-Za-Z0-9 -._?, '/\ & amp;%$#= ~]*) Senario pertama cukup mudah untuk diselesaikan dengan ^(http | https | ftp): [/] {2}. Untuk memadankan nama domain yang kita perlu ingat bahawa sah itu hanya boleh mengandungi huruf, digit, tanda hubung dan titik. Dalam contoh saya, saya mengehadkan bilangan aksara selepas tanda baca dari 2 hingga 4, tetapi boleh dilanjutkan untuk domain baru seperti .rocks atau .codes. Nama domain dipadankan dengan ([a-z0-9-.]. [A-za-z] {2,4}). Spesifikasi port pilihan dipadankan dengan mudah (: [0-9])?. URL boleh mengandungi pelbagai slash dan pelbagai aksara yang diulangi berkali-kali (lihat RFC3986), ini dipadankan dengan menggunakan pelbagai aksara dalam kumpulan ([a-z0-9 -._?, '/\ & Amp;%$ #= ~]*). Ia benar -benar berguna untuk memadankan setiap elemen penting dengan penangkapan kumpulan (), kerana ia akan mengembalikan hanya perlawanan yang kita perlukan. Ingat bahawa watak -watak tertentu perlu dilepaskan. Di bawah, setiap subpattern tunggal dijelaskan:
  1. ^ menegaskan kedudukan pada permulaan rentetan
  2. kumpulan menangkap (http | https | ftp), menangkap http atau https atau ftp
  3. : watak yang melarikan diri, sepadan dengan watak: secara literal
  4. [ /] {2} sepadan dengan tepat 2 kali watak yang melarikan diri /
  5. menangkap kumpulan ([a-z0-9-.]. [A-za-z] {2,4}):
    • [A-Za-Z0-9-.] Memadankan watak masa dan tidak terhad dalam julat antara a dan z, a dan z, 0 dan 9, watak-secara harfiah dan watak. Secara harfiah
    • . sepadan dengan watak. Secara harfiah
    • [a-za-z] {2,4}Memadankan satu watak antara 2 dan 4 kali antara a dan z atau a dan z (sensitif kes)
  6. menangkap kumpulan (: [0-9])?:
    • Quantifier? Memadankan kumpulan antara sifar atau lebih kali
    • : Memadankan watak: secara literal
    • [0-9] sepadan dengan watak tunggal antara 0 dan 9 satu atau lebih kali
  7. /? Memadankan watak / harfiah sifar atau satu kali
  8. menangkap kumpulan ([a-z0-9 -._?, '/\ & Amp;%$#= ~]*):
    • [a-z0-9 -._?, '/\ & Amp;%$#= ~]* Perlawanan antara sifar dan tidak terhad kali satu watak dalam julat a-z, a-z, 0-9, watak-watak : -._?, '/ & amp;%$#= ~.

memadankan tag html

Demystifying regex dengan contoh praktikal Senario:
  • tag permulaan mesti bermula dengan
  • tag akhir mesti bermula dengan diikuti oleh satu atau lebih aksara dan berakhir dengan>
  • kita mesti sepadan dengan kandungan di dalam elemen tag
Corak: (.*?) 1> Memadankan tag permulaan dan kandungan di dalamnya cukup mudah dengan Dan (.*?), Tetapi dalam corak di atas saya telah menambah sesuatu yang berguna: rujukan kepada kumpulan penangkapan. Setiap kumpulan penangkapan yang ditakrifkan oleh kurungan () boleh dirujuk menggunakan nombor kedudukannya, (pertama) (kedua) (ketiga), yang akan membolehkan operasi selanjutnya. Ungkapan di atas dapat dijelaskan sebagai:
  • mulakan dengan
  • Tangkap nama tag
  • diikuti oleh satu atau lebih chars
  • menangkap kandungan di dalam tag
  • tag penutup mestilah nama yang ditangkap sebelum>
Termasuk hanya dua kumpulan penangkapan dalam ungkapan, nama tag dan kandungan, akan mengembalikan perlawanan yang sangat jelas, senarai nama tag dengan kandungan yang berkaitan. Mari menggali sedikit lebih mendalam dan terangkan subpatterns:
  1. menangkap kumpulan ([w]) sepadan dengan mana-mana watak perkataan a-z0-9_ satu atau lebih kali
  2. .* Memadankan mana -mana watak (kecuali Newline) antara sifar atau lebih kali
  3. > sepadan dengan watak> secara harfiah
  4. menangkap kumpulan (.*?), Sepadan dengan mana -mana watak (kecuali newline), sifar dan lebih banyak kali
  5. / sepadan dengan watak / literal
  6. 1 sepadan dengan teks yang sama yang dipadankan dengan kumpulan penangkapan pertama: ([w])
  7. > Memadankan aksara> secara harfiah

sepadan dengan kata -kata duplikat

Demystifying regex dengan contoh praktikal Senario:
  • kata -kata adalah ruang yang dipisahkan
  • kita mesti sepadan dengan setiap pertindihan-yang tidak berturut-turut juga
Corak: b (w) b (? =.*1) Ekspresi biasa ini seolah -olah mencabar tetapi menggunakan beberapa konsep yang ditunjukkan sebelumnya. Corak memperkenalkan konsep sempadan perkataan. Batasan perkataan B terutamanya memeriksa kedudukan. Ia sepadan apabila watak perkataan (i.e.: Abcde) diikuti oleh watak bukan perkataan (iaitu: -~,!). Di bawah ini anda dapat mencari beberapa contoh penggunaan sempadan perkataan untuk menjadikannya lebih jelas: - Memandangkan ungkapan ungkapan biasa adalah hebat - perlawanan corak bareb adalah - Corak W {3} B dapat sepadan dengan tiga huruf terakhir kata -kata: lar, ion, adalah, ome Ungkapan di atas dapat dijelaskan sebagai:
  • padankan setiap watak perkataan diikuti oleh watak bukan perkataan (dalam ruang kes kami)
  • periksa sama ada perkataan yang dipadankan sudah ada atau tidak
Di bawah ini anda akan mendapat penjelasan untuk setiap corak sub:
  1. B sempadan perkataan
  2. menangkap kumpulan ([w]) sepadan dengan mana-mana watak perkataan a-z0-9_
  3. B sempadan perkataan
  4. (? =.*1) Positif Lookahead menegaskan bahawa berikut boleh dipadankan:
    • .* Memadankan mana -mana watak (kecuali Newline)
    • 1 sepadan dengan teks yang sama seperti kumpulan menangkap pertama
Ekspresi akan lebih masuk akal jika kita mengembalikan semua perlawanan dan bukan hanya kembali yang pertama. Lihat fungsi PHP preg_match_all untuk maklumat lanjut.

Pemikiran Akhir

Ekspresi biasa adalah pedang bermata dua. Lebih banyak kerumitan ditambah, semakin sukar untuk menyelesaikan masalah ini. Itulah sebabnya, kadang -kadang, sukar untuk mencari ungkapan biasa yang akan sepadan dengan semua kes, dan lebih baik menggunakan beberapa regex yang lebih kecil. Mempunyai senario masalah yang baik boleh sangat membantu, dan akan membolehkan anda mula memikirkan pelbagai watak, kekangan, dakwaan, pengulangan, nilai pilihan, dan lain -lain. Memberi perhatian lebih kepada penangkapan kumpulan akan menjadikan perlawanan berguna untuk pemprosesan selanjutnya. Jangan ragu untuk memperbaiki ungkapan dalam contoh, dan beritahu kami bagaimana anda melakukannya!

Sumber Berguna

Di bawah ini anda dapat mencari maklumat dan sumber lebih lanjut untuk membantu kemahiran regex anda berkembang. Jangan ragu untuk menambah komen kepada artikel jika anda mendapati sesuatu yang berguna yang tidak disenaraikan.

lea verou - /reg (exp) {2}Lained/: Demystifying Expressions Regular

https://www.youtube.com/watch?v=eklues9rvak

perpustakaan php

Nama Keterangan RegexpBuilder Mewujudkan regex menggunakan kaedah rantaian manusia yang boleh dibaca Noonoofluentregex Membina ungkapan regex menggunakan penetapan fasih dan istilah bahasa Inggeris seperti di atas Hoaregex Menyediakan alat untuk menganalisis regex dan menjana rentetan Regex terbalik Diberi ungkapan biasa akan menghasilkan rentetan

laman web

url Keterangan regex101.com PCRE Online Regex Tester regextester.com PCRE Online Regex Tester rexv.org PCRE Online Regex Tester debuggex.com Menyokong PCRE dan menyediakan debugger visual yang sangat berguna regexper.com Javascript style regex, tetapi berguna untuk debug phpliveregex.com Penguji dalam talian untuk fungsi preg regxlib.com Pangkalan data ekspresi biasa yang sedia untuk digunakan Regular-Erpressions.info Tutorial Regex, Kajian Buku, Contoh

buku

Tajuk Keterangan Pengarang editor Menguasai ungkapan biasa Mesti mempunyai buku regex Jeffrey Friedl O'Reilly Rujukan Pocket Ekspresi Biasa Ungkapan biasa untuk Perl, Ruby, PHP, Python, C, Java dan .NET Tony Stubblebine O'Reilly

Soalan Lazim (Soalan Lazim) Mengenai Ekspresi Biasa (Regex)

Apakah beberapa aplikasi praktikal ekspresi biasa (regex)? Mereka biasanya digunakan dalam pengesahan data untuk memastikan input pengguna sepadan dengan format tertentu, seperti alamat e -mel atau nombor telefon. Mereka juga boleh digunakan dalam mengikis web untuk mengekstrak kepingan maklumat tertentu dari laman web. Di samping itu, Regex boleh digunakan dalam pemprosesan teks untuk tugas -tugas seperti mencari dan menggantikan rentetan teks tertentu, memisahkan rentetan ke dalam pelbagai substrings, dan banyak lagi. ?

Mewujudkan ungkapan biasa yang kompleks melibatkan pemahaman dan menggabungkan pelbagai komponen regex. Ini termasuk literal, kelas watak, kuantifi, dan metacharacters. Dengan menggabungkan komponen ini dengan cara yang berbeza, anda boleh membuat ungkapan biasa yang sepadan dengan pelbagai corak. Sebagai contoh, anda boleh membuat ungkapan biasa yang sepadan dengan alamat e -mel, nombor telefon, atau URL.

Apakah beberapa kesilapan biasa untuk dielakkan apabila menggunakan ungkapan biasa (regex)? *), yang boleh menyebabkan hasil yang tidak dijangka. Satu lagi kesilapan biasa tidak dapat melepaskan watak khas apabila mereka dimaksudkan untuk ditafsirkan secara literal. Di samping itu, penting untuk diingat bahawa ungkapan biasa adalah sensitif kes secara lalai, jadi anda perlu menggunakan bendera yang sesuai jika anda ingin mengabaikan kes. >

Terdapat beberapa alat dalam talian yang tersedia yang membolehkan anda menguji ekspresi biasa anda. Alat ini biasanya membolehkan anda memasukkan ungkapan biasa dan rentetan ujian, dan kemudian mereka menyerlahkan bahagian -bahagian rentetan ujian yang sepadan dengan ungkapan biasa. Ini boleh menjadi cara terbaik untuk menyahpepijat ekspresi biasa anda dan memastikan mereka bekerja seperti yang diharapkan. ungkapan dalam beberapa bentuk. Walau bagaimanapun, sintaks khusus dan ciri yang disokong boleh berbeza -beza antara bahasa. Sebagai contoh, JavaScript, Python, dan Ruby semua menyokong ungkapan biasa, tetapi masing -masing mempunyai sintaks dan ciri unik mereka sendiri. Walaupun ungkapan biasa boleh menjadi sangat kuat, mereka juga boleh menjadi sumber yang berintensifkan jika tidak digunakan dengan betul. Ekspresi biasa kompleks boleh mengambil masa yang lama untuk melaksanakan, terutamanya pada rentetan teks yang besar. Oleh itu, penting untuk menggunakan ungkapan biasa dengan bijak dan mengoptimumkannya sebanyak mungkin. Ini termasuk mengelakkan kuantum yang tidak perlu, menggunakan kumpulan yang tidak menangkap apabila anda tidak memerlukan teks yang dipadankan, dan menggunakan kelas aksara dan bukannya penggantian jika mungkin. Di samping itu, beberapa enjin ekspresi biasa menawarkan ciri pengoptimuman, seperti kuantum malas, yang dapat meningkatkan prestasi. Tersedia untuk mempelajari lebih lanjut mengenai ungkapan biasa. Ini termasuk tutorial dalam talian, buku, dan platform pembelajaran interaktif. Di samping itu, banyak bahasa pengaturcaraan mempunyai dokumentasi yang luas mengenai sintaks dan ciri -ciri ekspresi biasa mereka. Untuk menghuraikan HTML atau XML, ia biasanya tidak disyorkan. Ini kerana HTML dan XML mempunyai struktur bersarang yang sukar untuk ditangkap dengan tepat dengan ungkapan biasa. Sebaliknya, biasanya lebih baik menggunakan parser HTML atau XML yang berdedikasi.

Apakah beberapa alternatif untuk ekspresi biasa (regex)?

Walaupun ungkapan biasa sangat kuat, mereka tidak selalu menjadi alat terbaik untuk pekerjaan itu. Bergantung pada tugas di tangan, anda mungkin lebih baik menggunakan pendekatan yang berbeza. Sebagai contoh, untuk tugas manipulasi rentetan mudah, anda mungkin dapat menggunakan kaedah rentetan terbina dalam dan bukannya ungkapan biasa. Untuk menghidupkan HTML atau XML, anda biasanya akan menggunakan parser khusus. Dan untuk tugas pemprosesan teks yang kompleks, anda mungkin ingin mempertimbangkan menggunakan perpustakaan pemprosesan bahasa semulajadi.

Atas ialah kandungan terperinci Demystifying regex dengan contoh praktikal. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan