วิธีใช้ Regex Tester
- ป้อนแพทเทิร์นระหว่างเครื่องหมายทับ โดยไม่ต้องใส่
/ ครอบ - เปิด/ปิดแฟล็ก เช่น
g (ทุกรายการที่ตรงกัน), i (ไม่สนตัวพิมพ์) และ m (หลายบรรทัด) - วางข้อความทดสอบ ส่วนที่ตรงกันจะถูกไฮไลต์ทางขวา และแสดงรายการพร้อมตำแหน่งและ capture group ด้านล่าง
- ติ๊ก แทนที่ และป้อนข้อความแทนที่ เช่น
$1 หรือ $<name> เพื่อดูตัวอย่าง String.replace - เลือกแพทเทิร์นจาก คลังแพทเทิร์น เพื่อเริ่มจาก regex สำหรับอีเมล URL IP หรือวันที่ที่ผ่านการทดสอบแล้ว
Regular expression ของ JavaScript
ตัวทดสอบนี้ใช้เอนจิน RegExp ของเบราว์เซอร์คุณเอง ผลลัพธ์จึงตรงกับที่ String.match, matchAll, replace และ RegExp.exec ส่งคืนใน JavaScript และ Node.js ทุกประการ รวมถึงไวยากรณ์สมัยใหม่: กลุ่มแบบมีชื่อ (?<name>…), lookbehind (?<=…), Unicode property escape อย่าง \p{L} กับแฟล็ก u และตำแหน่งของการจับคู่กับแฟล็ก d
แฟล็กแต่ละตัวทำอะไร
| แฟล็ก | ชื่อ | ผล |
g | global | ค้นหาทุกรายการที่ตรงกัน แทนที่จะหยุดที่รายการแรก |
i | ignoreCase | ตัวอักษรตรงกันโดยไม่สนตัวพิมพ์เล็กใหญ่ |
m | multiline | ^ และ $ ตรงกับจุดเริ่มและจุดจบของแต่ละบรรทัด |
s | dotAll | . ตรงกับการขึ้นบรรทัดใหม่ด้วย |
u | unicode | ถือว่าแพทเทิร์นเป็น code point และเปิดใช้ \p{…} และ \u{…} |
y | sticky | จับคู่เฉพาะที่ตำแหน่ง lastIndex ปัจจุบัน |
d | hasIndices | รายงานตำแหน่งเริ่มและจบของแต่ละ capture group |
การป้องกัน catastrophic backtracking
แพทเทิร์นที่มี quantifier ซ้อนกัน เช่น (a+)+$ หรือ (\w|\d)*x อาจใช้เวลาแบบเอกซ์โพเนนเชียลกับข้อมูลที่เกือบตรงกัน ในหน้าเว็บปกติจะทำให้แท็บค้าง แต่ที่นี่การจับคู่ทุกครั้งทำงานใน Web Worker เบื้องหลังที่ถูกหยุดหลังหนึ่งวินาที และคุณจะได้รับคำเตือนที่ชัดเจนแทนเบราว์เซอร์ที่ค้าง แพทเทิร์นเดียวกันในโค้ด production อาจเป็นช่องโหว่ ReDoS จึงควรถือว่าคำเตือนนี้เป็นบั๊กที่ต้องแก้
เคล็ดลับการเขียน regex ที่ดีขึ้น
- ยึดแพทเทิร์นด้วย
^ และ $ เมื่อตรวจสอบค่าทั้งค่า มิฉะนั้นการตรงกันที่ใดก็ได้ในสตริงจะผ่าน
- ใช้คลาสที่เจาะจงอย่าง
[^"]* แทน .* ซึ่งเร็วกว่าและไม่จับเกิน
- ใช้กลุ่มที่ไม่จับค่า
(?:…) เมื่อไม่ต้องการค่าที่จับได้
- ตั้งชื่อให้กลุ่ม
match.groups.year อ่านง่ายกว่า match[1]
คำถามที่พบบ่อย
ตัวทดสอบนี้ใช้ regex แบบใด?
JavaScript (ECMAScript) ผ่าน RegExp ที่มีในเบราว์เซอร์ของคุณ ไวยากรณ์ส่วนใหญ่ใช้ร่วมกับ PCRE, Python และ Java แต่ฟีเจอร์อย่าง possessive quantifier, atomic group และ inline modifier เช่น (?i) ไม่มีใน JavaScript
ทำไมแพทเทิร์นของฉันพบแค่รายการเดียว?
หากไม่มีแฟล็ก g (global) JavaScript จะหยุดหลังรายการแรกที่ตรงกัน เปิด g เพื่อค้นหาทุกรายการ
อ้างอิงกลุ่มในข้อความแทนที่อย่างไร?
ใช้ $1, $2… สำหรับกลุ่มแบบตัวเลข, $<name> สำหรับกลุ่มแบบมีชื่อ, $& สำหรับส่วนที่ตรงกันทั้งหมด และ $$ สำหรับเครื่องหมายดอลลาร์ตามตัว
ทำไมตัวทดสอบหยุดเพราะหมดเวลา?
แพทเทิร์นใช้เวลามากกว่าหนึ่งวินาทีกับข้อมูลของคุณ ซึ่งแทบทุกครั้งหมายถึง catastrophic backtracking ให้มองหา quantifier ซ้อนกันอย่าง (x+)+ หรือทางเลือกที่ทับซ้อนกันอย่าง (a|a)* แล้วเขียนใหม่ให้แต่ละอักขระจับคู่ได้เพียงวิธีเดียว
ข้อมูลทดสอบของฉันถูกส่งไปที่ใดหรือไม่?
ไม่ การจับคู่ทำงานภายในเครื่องใน Web Worker ในเบราว์เซอร์ของคุณ แพทเทิร์นและข้อความถูกเก็บไว้เฉพาะในเบราว์เซอร์ของคุณเอง เพื่อให้ยังอยู่เมื่อคุณกลับมา