Ungkapan Nalar untuk Manusia: Panduan Praktikal
Ungkapan nalar (regex) mempunyai masalah reputasi. Ia kelihatan seperti seseorang tertidur di atas papan kekunci mereka: ^[\w.-]+@[\w-]+\.[\w.]+$. Ia muncul dalam ulasan kod, editor teks, alat carian, dan pengesahan borang. Pembangun sama ada menyukainya atau mengelakkannya sepenuhnya.
Kebenaran ada di antara keduanya. Regex memang berkuasa. Ia juga memang mengelirukan pada mulanya. Tetapi anda tidak perlu menguasai setiap ciri yang tidak jelas untuk mendapat nilai praktikal. Segenggam corak merangkumi sebahagian besar kes penggunaan dunia nyata.
Apa yang Regex Sebenarnya Lakukan
Ungkapan nalar adalah corak yang menerangkan sekumpulan rentetan. Anda memberikannya kepada alat carian, dan ia mencari setiap rentetan yang sepadan dengan corak tersebut. Anggapkannya sebagai pertanyaan carian yang sangat tepat.
Carian biasa: cari tepat "hello" Carian regex: cari apa sahaja yang kelihatan seperti alamat e-mel, nombor telefon, tarikh, URL, atau corak lain yang boleh anda huraikan.
Tahukah anda? Ungkapan nalar dicipta oleh ahli matematik Stephen Kleene pada tahun 1956 sebagai notasi untuk menerangkan "bahasa nalar" dalam teori bahasa formal. Ia memasuki pengkomputeran melalui editor teks Unix awal pada 1960-an dan 1970-an.
Blok Binaan
Aksara Literal
Regex paling mudah hanyalah teks literal. Corak hello sepadan dengan rentetan "hello." Tiada yang mewah.
Titik (.) — Mana-mana Aksara Tunggal
Titik sepadan dengan mana-mana aksara tunggal (kecuali baris baru).
h.tsepadan dengan "hat," "hit," "hot," "hut," dan bahkan "h3t"
Kelas Aksara ([]) — Aksara Tertentu
Kurungan segi empat mentakrifkan set aksara yang dibenarkan pada kedudukan tersebut.
[aeiou]sepadan dengan mana-mana huruf vokal tunggal[0-9]sepadan dengan mana-mana digit[A-Za-z]sepadan dengan mana-mana huruf (besar atau kecil)[^0-9]sepadan dengan mana-mana aksara yang BUKAN digit (tanda^dalam kurungan bermakna "bukan")
Pengkuantiti — Berapa Banyak
Simbol-simbol ini mengawal pengulangan:
| Simbol | Makna | Contoh | Sepadan |
|---|---|---|---|
* |
Sifar atau lebih | ab*c |
"ac," "abc," "abbc," "abbbc" |
+ |
Satu atau lebih | ab+c |
"abc," "abbc," "abbbc" (bukan "ac") |
? |
Sifar atau satu | colou?r |
"color" dan "colour" |
{3} |
Tepat 3 | a{3} |
"aaa" |
{2,4} |
Antara 2 dan 4 | a{2,4} |
"aa," "aaa," "aaaa" |
Jangkar — Kedudukan
^di permulaan bermakna "permulaan rentetan"$di akhir bermakna "akhir rentetan"^hello$hanya sepadan dengan rentetan tepat "hello," bukan "say hello" atau "hello world"
Kelas Singkatan
Kelas aksara biasa mempunyai pintasan:
| Singkatan | Setara | Makna |
|---|---|---|
\d |
[0-9] |
Mana-mana digit |
\w |
[A-Za-z0-9_] |
Mana-mana aksara "perkataan" |
\s |
[ \t\n\r] |
Mana-mana ruang putih |
\D |
[^0-9] |
Mana-mana bukan digit |
\W |
[^A-Za-z0-9_] |
Mana-mana aksara bukan perkataan |
\S |
[^ \t\n\r] |
Mana-mana bukan ruang putih |
Kumpulan (()) — Pengumpulan dan Penangkapan
Kurungan mengumpulkan bahagian corak. Ini berguna untuk menggunakan pengkuantiti kepada kumpulan atau untuk mengekstrak bahagian tertentu dari padanan.
(ab)+sepadan dengan "ab," "abab," "ababab"(\d{3})-(\d{4})sepadan dengan "555-1234" dan menangkap "555" dan "1234" secara berasingan
Paip (|) — Atau
Paip bermakna "atau."
cat|dogsepadan dengan "cat" atau "dog"(jpg|png|gif)sepadan dengan mana-mana daripada tiga sambungan imej ini
Corak Praktikal yang Boleh Anda Gunakan Hari Ini
Padankan Alamat E-mel (Mudah)
[\w.-]+@[\w-]+\.[\w.]+
Memecahkannya:
[\w.-]+— satu atau lebih aksara perkataan, titik, atau tanda sempang (bahagian tempatan)@— tanda @ literal[\w-]+— satu atau lebih aksara perkataan atau tanda sempang (domain)\.— titik literal (dilepas kerana.adalah aksara khas)[\w.]+— satu atau lebih aksara perkataan atau titik (TLD)
Amaran Pengesahan e-mel dengan regex adalah terkenal sukar untuk dilakukan dengan sempurna. Corak mudah di atas merangkumi 99% alamat e-mel dunia nyata tetapi tidak mengendalikan setiap kes tepi yang ditakrifkan dalam spesifikasi RFC. Untuk pengesahan produksi, gunakan pustaka pengesahan e-mel bahasa pengaturcaraan anda.
Padankan Nombor Telefon (Format AS)
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
Ini sepadan dengan:
- (555) 123-4567
- 555-123-4567
- 555.123.4567
- 555 123 4567
Padankan URL
https?://[\w.-]+(/[\w./-]*)?
Ini sepadan dengan:
Padankan Tarikh (YYYY-MM-DD)
\d{4}-\d{2}-\d{2}
Ini sepadan dengan: 2026-03-23, 1999-12-31, dsb.
Cari Perkataan Berganda
\b(\w+)\s+\1\b
Ini sepadan dengan perkataan berulang seperti "the the" atau "is is." \1 merujuk kembali kepada apa sahaja yang ditangkap oleh kumpulan pertama.
Padankan Alamat IPv4
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
Ini sepadan dengan corak seperti 192.168.1.1 atau 10.0.0.255.
Petua untuk Menulis Regex
1. Mulakan dengan Mudah, Kemudian Halusi
Jangan cuba menulis regex yang sempurna pada percubaan pertama. Mulakan dengan corak yang luas, ujinya terhadap data anda, dan ketatkannya.
2. Sentiasa Uji
Regex mudah untuk disalah. Pengkuantiti yang hilang atau titik yang tidak dilepas boleh sepenuhnya mengubah apa yang sepadan. Sentiasa uji corak anda terhadap data dunia nyata sebelum menggunakannya dalam produksi.
3. Lepaskan Aksara Khas
Jika anda perlu memadankan titik literal, kurungan, kurungan segi empat, atau aksara khas lain, lepaskannya dengan garis miring ke belakang: \., \(, \[.
4. Gunakan Ulasan dan Kumpulan Bernama
Dalam corak yang kompleks, gunakan kumpulan bernama dan ulasan (di mana disokong) untuk menjadikan regex mudah dibaca. Diri anda pada masa hadapan akan berterima kasih.
5. Tahu Bila Tidak Menggunakan Regex
Regex adalah alat yang salah untuk menghurai HTML, XML, JSON, atau mana-mana struktur bersarang. Gunakan penghurai yang betul untuk itu.
Petua Uji dan debug corak regex anda dalam masa nyata: Cara Menguji Corak Regex. Tampal corak dan data ujian anda, dan lihat padanan diserlahkan dengan serta-merta.
Mula menguji regex sekarang:
Percuma, maklum balas segera, dan tidak perlu daftar.