Ungkapan nalar mempunyai reputasi kelihatan seperti bunyi rawak. Corak seperti ^[\w.-]+@[\w-]+\.\w{2,}$ boleh terasa seperti kucing berjalan melintasi papan kekunci. Tetapi di sebalik sintaks yang sukar dibaca terdapat idea yang sangat elegan: bahasa ringkas untuk menghuraikan corak dalam teks.
Sama ada anda mengesahkan input borang, mencari fail log, membersihkan data, atau melakukan cari-dan-ganti merentas pangkalan kod, regex adalah salah satu alat paling serba guna dalam kit alat pembangun. Dan anda tidak perlu menghafal setiap ciri yang jarang digunakan untuk mendapat nilai sebenar daripadanya. Segenggam blok binaan meliputi majoriti besar kes penggunaan praktikal.
Apa yang regex sebenarnya lakukan
Ungkapan nalar (regex atau regexp) ialah corak yang menghuraikan satu set rentetan. Anda memberikannya kepada enjin carian — dalam bahasa pengaturcaraan, editor teks, atau alat baris perintah anda — dan ia mencari setiap rentetan yang sepadan.
Fikirkannya sebagai pertanyaan carian yang dinaik taraf:
- Carian biasa: cari perkataan tepat "error"
- Carian regex: cari apa sahaja yang kelihatan seperti alamat IP, tarikh, alamat e-mel, atau sebarang struktur yang boleh anda huraikan
Regex dicipta oleh ahli matematik Stephen Kleene pada 1956 dan memasuki pengkomputeran melalui editor teks Unix pada 1960-an. Hari ini ia disokong dalam hampir setiap bahasa pengaturcaraan dan editor teks.
Blok binaan
Aksara literal
Regex paling mudah ialah teks biasa. Corak hello sepadan dengan rentetan "hello" di mana sahaja ia muncul. Tiada yang rumit.
Titik (.) — sebarang aksara
Titik sepadan dengan mana-mana satu aksara kecuali baris baharu.
h.tsepadan dengan "hat", "hit", "hot", "h3t", dan juga "h t"
Kelas aksara ([])
Kurungan segi empat mentakrifkan set aksara yang dibenarkan pada satu kedudukan.
[aeiou]— sebarang vokal[0-9]— sebarang digit[A-Za-z]— sebarang huruf[^0-9]— sebarang aksara yang BUKAN digit (^di dalam kurungan bermaksud "bukan")
Kelas pintasan
| Pintasan | Maksud | Setara |
|---|---|---|
\d |
Sebarang digit | [0-9] |
\w |
Aksara perkataan | [A-Za-z0-9_] |
\s |
Ruang putih | [ \t\n\r] |
\D |
Bukan digit | [^0-9] |
\W |
Bukan aksara perkataan | [^A-Za-z0-9_] |
\S |
Bukan ruang putih | [^ \t\n\r] |
Pengkuantiti — berapa banyak
Pengkuantiti mengawal berapa kali elemen sebelumnya mesti muncul.
| Simbol | Maksud | Contoh | Sepadan |
|---|---|---|---|
* |
Sifar atau lebih | ab*c |
"ac", "abc", "abbc" |
+ |
Satu atau lebih | ab+c |
"abc", "abbc" (bukan "ac") |
? |
Sifar atau satu | colou?r |
"color" dan "colour" |
{3} |
Tepat 3 | \d{3} |
"123", "456" |
{2,4} |
Antara 2 dan 4 | \d{2,4} |
"12", "123", "1234" |
Sauh — kedudukan
^— permulaan rentetan (atau baris, dengan benderam)$— penghujung rentetan (atau baris)\b— sempadan perkataan
Corak ^\d{4}$ sepadan dengan rentetan yang tepat empat digit, seperti "2026", tetapi bukan "abc2026" atau "2026xyz".
Kumpulan dan alternatif
(abc)— menangkap "abc" sebagai kumpulana|b— sepadan dengan "a" atau "b"(cat|dog)— sepadan dengan "cat" atau "dog"
Kumpulan juga membolehkan anda menggunakan pengkuantiti pada urutan: (ha)+ sepadan dengan "ha", "haha", "hahaha".
Corak praktikal biasa
Mengesahkan e-mel (asas)
^[\w.-]+@[\w-]+\.\w{2,}$
Ini sepadan dengan user@example.com, first.last@company.co.uk (sebahagian), dan menolak rentetan tanpa @ atau domain.
Penting: Mengesahkan alamat e-mel dengan sempurna menggunakan regex terkenal sukar — spesifikasi penuh RFC 5322 sangat kompleks. Untuk sistem pengeluaran, gunakan regex asas untuk semakan format dan kemudian sahkan alamat dengan menghantar e-mel pengesahan.
Memadankan nombor telefon
\+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4}
Ini mengendalikan format seperti +1 555 123 4567, 555-123-4567, dan (555) 123-4567.
Memadankan URL
https?://[\w.-]+(/[\w./?&=-]*)?
Sepadan dengan https://example.com, http://example.com/path?q=hello.
Memadankan tarikh (YYYY-MM-DD)
\d{4}-\d{2}-\d{2}
Sepadan dengan 2026-03-29, 1999-12-31. Nota: ini menyemak format sahaja, bukan kesahihan — ia juga sepadan dengan 9999-99-99.
Bendera yang mengubah tingkah laku
Kebanyakan enjin regex menyokong bendera yang mengubah cara corak digunakan:
| Bendera | Nama | Kesan |
|---|---|---|
g |
Global | Cari semua padanan, bukan hanya yang pertama |
i |
Tidak peka huruf besar/kecil | hello sepadan dengan "Hello", "HELLO", dll. |
m |
Berbilang baris | ^ dan $ sepadan dengan permulaan/penghujung setiap baris |
s |
Dotall | . juga sepadan dengan aksara baris baharu |
Dalam JavaScript, bendera ditambah selepas garis miring penutup: /hello/gi. Dalam Python, ia dihantar sebagai argumen: re.findall(r"hello", text, re.IGNORECASE).
Bila regex berlebihan
Regex berkuasa, tetapi ia tidak sentiasa alat yang betul:
- Menghurai HTML atau XML. Gunakan penghurai DOM yang sesuai. Regex tidak boleh mengendalikan tag bersarang secara andal.
- Menghurai JSON. Gunakan
JSON.parse()atau yang setara. Regex akan pecah pada kes pinggir. - Pengesahan kompleks. Jika corak anda merangkumi berbilang baris dan mengambil masa lima minit untuk dibaca, pertimbangkan menulis kod pengesahan prosedural.
- Operasi rentetan mudah. Jika anda hanya perlu
startsWith(),includes(), atausplit(), kaedah rentetan biasa lebih jelas dan lebih cepat.
Perangkap biasa
- Terlupa melepaskan aksara khas. Titik
.sepadan dengan sebarang aksara. Untuk sepadan dengan titik literal, gunakan\.. Sama untuk(,),[,],+,*,?,{,},^,$,|, dan\. - Padanan tamak lawan malas. Secara lalai,
.*adalah tamak — ia sepadan sebanyak mungkin. Tambah?untuk menjadikannya malas:.*?sepadan sesedikit mungkin. Ini penting apabila mengekstrak kandungan antara pembatas. - Penjejakan balik bencana. Pengkuantiti bersarang seperti
(a+)+boleh menyebabkan enjin mencuba bilangan laluan eksponen pada input tertentu, membekukan program anda. Elakkan pengulangan bersarang pada corak yang bertindih. - Terlupa sauh. Tanpa
^dan$, corak anda sepadan dengan subrentetan.\d{3}sepadan dengan "123" di dalam "abc12345". Gunakan^\d{3}$jika anda memerlukan padanan tepat.
Lebih lanjut
Cara terbaik untuk belajar regex ialah dengan mencuba. Taip satu corak, tampal teks ujian, dan lihat apa yang menyala. Laraskan dan ulang sehingga anda faham bagaimana setiap bahagian berfungsi.
- Cara Menguji Corak Regex — tutorial interaktif dengan contoh
- Penguji Regex — tampal corak dan data ujian anda, lihat padanan diserlahkan dalam masa nyata
