Regular Expression สำหรับมนุษย์: คู่มือปฏิบัติ
Regular expression (regex) มีปัญหาเรื่องชื่อเสียง มันดูเหมือนใครสักคนหลับคาแป้นพิมพ์: ^[\w.-]+@[\w-]+\.[\w.]+$ มันปรากฏใน code review ตัวแก้ไขข้อความ เครื่องมือค้นหา และการตรวจสอบแบบฟอร์ม นักพัฒนาอาจรักมันหรือหลีกเลี่ยงทั้งหมด
ความจริงอยู่ระหว่างกลาง Regex ทรงพลังจริง มันก็สับสนจริงในตอนแรก แต่คุณไม่ต้องเชี่ยวชาญทุกฟีเจอร์ที่ไม่ค่อยพบเพื่อได้ประโยชน์ปฏิบัติ รูปแบบไม่กี่ตัวครอบคลุมกรณีใช้งานจริงส่วนใหญ่
Regex ทำอะไรกันแน่
Regular expression คือรูปแบบที่อธิบายชุดของสตริง คุณให้มันกับเครื่องมือค้นหา แล้วมันจะค้นหาทุกสตริงที่ตรงกับรูปแบบ คิดว่าเป็นคำค้นที่แม่นยำมาก
ค้นหาปกติ: ค้นหาคำว่า "hello" ตรงตัว ค้นหาด้วย Regex: ค้นหาอะไรก็ได้ที่ดูเหมือนที่อยู่อีเมล เบอร์โทรศัพท์ วันที่ URL หรือรูปแบบอื่นที่คุณอธิบายได้
รู้หรือไม่? Regular expression ถูกคิดค้นโดยนักคณิตศาสตร์ Stephen Kleene ในปี 1956 เป็นสัญลักษณ์สำหรับอธิบาย "regular languages" ในทฤษฎีภาษาเชิงรูปนัย มันเข้าสู่วงการคอมพิวเตอร์ผ่านตัวแก้ไขข้อความ Unix ยุคแรกในทศวรรษ 1960 และ 1970
องค์ประกอบพื้นฐาน
ตัวอักษรตรงตัว
Regex ที่ง่ายที่สุดคือข้อความตรงตัว รูปแบบ hello ตรงกับสตริง "hello" ไม่มีอะไรซับซ้อน
จุด (.) — ตัวอักษรใดก็ได้หนึ่งตัว
จุดตรงกับตัวอักษรใดก็ได้หนึ่งตัว (ยกเว้นขึ้นบรรทัดใหม่)
h.tตรงกับ "hat," "hit," "hot," "hut," และแม้แต่ "h3t"
Character Class ([]) — ตัวอักษรเฉพาะ
วงเล็บเหลี่ยมกำหนดชุดตัวอักษรที่อนุญาตในตำแหน่งนั้น
[aeiou]ตรงกับสระตัวเดียว[0-9]ตรงกับตัวเลขใดก็ได้[A-Za-z]ตรงกับตัวอักษรใดก็ได้ (ตัวพิมพ์ใหญ่หรือเล็ก)[^0-9]ตรงกับตัวอักษรที่ไม่ใช่ตัวเลข (^ในวงเล็บหมายถึง "ไม่ใช่")
Quantifier — จำนวน
สัญลักษณ์เหล่านี้ควบคุมการซ้ำ:
| สัญลักษณ์ | ความหมาย | ตัวอย่าง | ตรงกับ |
|---|---|---|---|
* |
ศูนย์หรือมากกว่า | ab*c |
"ac," "abc," "abbc," "abbbc" |
+ |
หนึ่งหรือมากกว่า | ab+c |
"abc," "abbc," "abbbc" (ไม่ใช่ "ac") |
? |
ศูนย์หรือหนึ่ง | colou?r |
"color" และ "colour" |
{3} |
ตรง 3 ตัว | a{3} |
"aaa" |
{2,4} |
ระหว่าง 2 ถึง 4 | a{2,4} |
"aa," "aaa," "aaaa" |
Anchor — ตำแหน่ง
^ที่จุดเริ่มต้นหมายถึง "ต้นสตริง"$ที่ท้ายหมายถึง "ท้ายสตริง"^hello$ตรงกับเฉพาะสตริง "hello" ไม่ใช่ "say hello" หรือ "hello world"
Shorthand Class
Character class ที่พบบ่อยมีชวเลข:
| ชวเลข | เทียบเท่า | ความหมาย |
|---|---|---|
\d |
[0-9] |
ตัวเลขใดก็ได้ |
\w |
[A-Za-z0-9_] |
ตัวอักษร "word" ใดก็ได้ |
\s |
[ \t\n\r] |
ช่องว่างใดก็ได้ |
\D |
[^0-9] |
ที่ไม่ใช่ตัวเลข |
\W |
[^A-Za-z0-9_] |
ที่ไม่ใช่ตัวอักษร word |
\S |
[^ \t\n\r] |
ที่ไม่ใช่ช่องว่าง |
Group (()) — การจัดกลุ่มและจับ
วงเล็บจัดกลุ่มส่วนของรูปแบบ มีประโยชน์สำหรับใช้ quantifier กับกลุ่มหรือดึงส่วนเฉพาะของผลลัพธ์
(ab)+ตรงกับ "ab," "abab," "ababab"(\d{3})-(\d{4})ตรงกับ "555-1234" และจับ "555" กับ "1234" แยกกัน
ท่อ (|) — หรือ
ท่อหมายถึง "หรือ"
cat|dogตรงกับ "cat" หรือ "dog"(jpg|png|gif)ตรงกับนามสกุลรูปภาพทั้งสาม
รูปแบบปฏิบัติที่ใช้ได้วันนี้
จับคู่ที่อยู่อีเมล (ง่าย)
[\w.-]+@[\w-]+\.[\w.]+
แยกส่วน:
[\w.-]+— ตัวอักษร word จุด หรือขีดกลาง หนึ่งตัวขึ้นไป (ส่วน local)@— เครื่องหมาย @ ตรงตัว[\w-]+— ตัวอักษร word หรือขีดกลาง หนึ่งตัวขึ้นไป (โดเมน)\.— จุดตรงตัว (ต้อง escape เพราะ.เป็นอักขระพิเศษ)[\w.]+— ตัวอักษร word หรือจุด หนึ่งตัวขึ้นไป (TLD)
คำเตือน การตรวจสอบอีเมลด้วย regex นั้นยากที่จะทำให้สมบูรณ์แบบ รูปแบบง่ายๆ ข้างต้นครอบคลุม 99% ของที่อยู่อีเมลจริง แต่ไม่ได้จัดการทุก edge case ที่กำหนดใน RFC specification สำหรับการตรวจสอบใน production ใช้ไลบรารีตรวจสอบอีเมลของภาษาโปรแกรมของคุณ
จับคู่เบอร์โทรศัพท์ (รูปแบบสหรัฐ)
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
ตรงกับ:
- (555) 123-4567
- 555-123-4567
- 555.123.4567
- 555 123 4567
จับคู่ URL
https?://[\w.-]+(/[\w./-]*)?
ตรงกับ:
จับคู่วันที่ (YYYY-MM-DD)
\d{4}-\d{2}-\d{2}
ตรงกับ: 2026-03-23, 1999-12-31 ฯลฯ
ค้นหาคำซ้ำ
\b(\w+)\s+\1\b
ตรงกับคำที่ซ้ำเช่น "the the" หรือ "is is" \1 อ้างอิงกลับไปยังสิ่งที่ถูกจับโดยกลุ่มแรก
จับคู่ที่อยู่ IPv4
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
ตรงกับรูปแบบเช่น 192.168.1.1 หรือ 10.0.0.255
เคล็ดลับการเขียน Regex
1. เริ่มง่ายๆ แล้วค่อยปรับ
อย่าพยายามเขียน regex ที่สมบูรณ์แบบตั้งแต่แรก เริ่มด้วยรูปแบบกว้าง ทดสอบกับข้อมูล แล้วค่อยปรับให้เข้มขึ้น
2. ทดสอบเสมอ
Regex ผิดพลาดได้ง่าย quantifier ที่หาย หรือจุดที่ไม่ได้ escape สามารถเปลี่ยนสิ่งที่ตรงได้ทั้งหมด ทดสอบรูปแบบกับข้อมูลจริงก่อนใช้ใน production เสมอ
3. Escape อักขระพิเศษ
ถ้าต้องจับคู่จุดตรงตัว วงเล็บ หรืออักขระพิเศษอื่น escape ด้วย backslash: \., \(, \[
4. ใช้ Comment และ Named Group
ในรูปแบบที่ซับซ้อน ใช้ named group และ comment (เมื่อรองรับ) เพื่อทำให้ regex อ่านได้ ตัวคุณในอนาคตจะขอบคุณ
5. รู้ว่าเมื่อไหร่ไม่ควรใช้ Regex
Regex เป็นเครื่องมือที่ผิดสำหรับการแปลค่า HTML, XML, JSON หรือโครงสร้างซ้อน ใช้ parser ที่เหมาะสมสำหรับสิ่งเหล่านั้น
เคล็ดลับ ทดสอบและดีบัก regex ของคุณแบบเรียลไทม์: วิธีทดสอบรูปแบบ Regex วางรูปแบบและข้อมูลทดสอบ แล้วดูผลลัพธ์ที่ไฮไลท์ทันที
เริ่มทดสอบ regex ตอนนี้เลย:
ฟรี ข้อเสนอแนะทันที และไม่ต้องลงทะเบียน