หน้าแรก › บทความ › ทำไม RegEx จับคู่ข้อความไม่ตรง
นักพัฒนาและเว็บ

ทำไม RegEx ถึงจับคู่ข้อความไม่ตรง? เจาะลึก Regex Flags โหมด Multiline และการ Escape อักขระพิเศษ

วันที่เผยแพร่: 28 ตุลาคม 2026 • อัปเดตล่าสุด: 2 พฤศจิกายน 2026 • ผู้เขียน: ทีมวิศวกร GoToolstack • เครื่องมือที่ใช้ทดสอบ: เครื่องมือทดสอบ RegEx GoToolstack
ทดสอบและดีบั๊กนิพจน์ทั่วไป (RegEx) แบบเรียลไทม์: แสดงการไฮไลต์กลุ่มจับคู่ (Capture Groups) อธิบายความหมายของแพทเทิร์น และทดสอบแฟล็ก g, m, s, i, u ได้ทันที
เปิดเครื่องมือทดสอบ RegEx
สารบัญเนื้อหา
  1. ความสำคัญของแฟล็ก (Flags) ใน Regular Expression
  2. กับดักสถานะ lastIndex เมื่อใช้แฟล็ก g ในลูป
  3. คำถามที่พบบ่อย (FAQ)

1. ความสำคัญของแฟล็ก (Flags) ใน Regular Expression

การเขียนแพทเทิร์น RegEx ที่ถูกต้องเป็นเพียงครึ่งหนึ่งของความสำเร็จ อีกครึ่งหนึ่งขึ้นอยู่กับการเลือกแฟล็กที่เหมาะสม:

แฟล็ก ชื่อโหมด พฤติกรรมการทำงาน
g Global ค้นหาข้อความที่ตรงกันทั้งหมด ไม่หยุดที่ผลลัพธ์แรก
m Multiline ทำให้ ^ และ $ จับคู่ที่ต้นและท้ายของ แต่ละบรรทัด ไม่ใช่ทั้งสตริง
s DotAll ทำให้เครื่องหมายจุด . สามารถจับคู่อักขระขึ้นบรรทัดใหม่ \n ได้ด้วย
i Ignore Case ไม่แยกความแตกต่างระหว่างตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก
u Unicode จัดการอักขระ Unicode และอิโมจิได้อย่างถูกต้องตามโค้ดพอยต์ 32 บิต

2. กับดักสถานะ lastIndex เมื่อใช้แฟล็ก g ในลูป

ในภาษา JavaScript เมื่อสร้างอ็อบเจกต์ RegExp ด้วยแฟล็ก g อ็อบเจกต์นั้นจะมีสถานะภายใน (Stateful) โดยคุณสมบัติ regex.lastIndex จะถูกอัปเดตเป็นดัชนีสุดท้ายที่จับคู่ได้ หากคุณเรียกใช้ regex.test(str) ซ้ำๆ ในลูป ฟังก์ชันอาจส่งกลับผลลัพธ์สลับไปมาระหว่าง true และ false อย่างไม่น่าเชื่อ วิธีแก้ไขคือรีเซ็ต regex.lastIndex = 0 หรือสร้างนิพจน์ใหม่

คำถามที่พบบ่อย (FAQ)

ความแตกต่างระหว่าง Greedy และ Lazy Quantifier คืออะไร?

Greedy (เช่น .*) จะพยายามกลืนกินตัวอักษรให้ได้มากที่สุดเท่าที่เป็นไปได้ ในขณะที่ Lazy (เช่น .*?) จะหยุดทันทีที่พบจุดจับคู่แรกที่ตรงตามเงื่อนไข