เครื่องมือนี้ทำอะไร
ตัวทดสอบ regex แบบ PCRE ตรวจ regular expression กับข้อความของคุณโดยใช้ไลบรารี PCRE2 ตัวจริง ซึ่งเป็นเอนจินเดียวกับที่ PHP เครื่องมือสไตล์ Perl และเว็บเซิร์ฟเวอร์จำนวนมากใช้ รายการที่ตรงจะถูกไฮไลต์ แต่ละรายการแสดงพร้อมตำแหน่งและ capture group และสามารถใส่ข้อความแทนที่เพื่อดูผลการแทนที่แบบ preg_replace ได้
การทดสอบกับเอนจินจริงสำคัญ เพราะ regular expression ของ PCRE และ JavaScript ต่างกันในจุดเล็ก ๆ แต่สำคัญ แพทเทิร์นที่ใช้ได้ในตัวทดสอบบนเบราว์เซอร์อาจคอมไพล์ไม่ผ่านใน PHP หรือจับคู่ได้ผลต่างออกไป
วิธีใช้งาน
- พิมพ์แพทเทิร์นโดยไม่ต้องมีตัวคั่นลงใน แพทเทิร์น PCRE
- วางข้อความที่ต้องการค้นหาลงใน ข้อความทดสอบ
- เปิด modifier ที่ต้องการ: g สำหรับทุกรายการที่ตรง (เหมือน preg_match_all), i, m, s, x, U และ u สำหรับ
\w,\dและ\bที่รองรับ Unicode - หากต้องการ กรอก แทนที่ด้วย เพื่อพรีวิวการแทนที่ ใช้
$1หรือ${1}สำหรับกลุ่มแบบลำดับเลข${name}สำหรับกลุ่มที่ตั้งชื่อ และ$0สำหรับข้อความที่ตรงทั้งหมด
แพทเทิร์นที่ไม่ถูกต้องจะแสดงข้อความแจ้งข้อผิดพลาดของ PCRE2 เอง พร้อมตำแหน่งในแพทเทิร์นที่เอนจินหยุดทำงาน
ตัวอย่าง
แพทเทิร์นเริ่มต้น \((?:[^()]++|(?R))*\) ค้นหาวงเล็บที่เปิดปิดครบคู่ โดยจับคู่วงเล็บหนึ่งคู่ที่ภายในมีอักขระที่ไม่ใช่วงเล็บ หรือมีแพทเทิร์นทั้งหมดซ้อนอยู่อีกครั้งแบบ recursive ในข้อความตัวอย่าง จะพบ (a, g(b, c)) และ ((x), y) และข้ามวงเล็บที่ไม่ได้ปิดตอนท้าย regular expression ของ JavaScript เขียนแบบนี้ไม่ได้
ลองใช้ (?<amount>\d+(?:\.\d+)?)\s+(?<cur>USD|EUR) กับข้อความแทนที่ ${cur} $1 เพื่อสลับจำนวนเงินกับรหัสสกุลเงินในบรรทัดที่สอง
ความสามารถของ PCRE ที่ควรรู้
- Possessive quantifier (
*+,++,?+) และ atomic group ((?>...)) จะไม่คืนสิ่งที่จับคู่ไปแล้ว ช่วยป้องกัน backtracking ที่ไม่สิ้นสุด \Kรีเซ็ตจุดเริ่มต้นของรายการที่ตรง เป็นทางเลือกแบบง่ายแทน lookbehind- Recursion ด้วย
(?R),(?1)หรือ(?&name)ใช้จับคู่โครงสร้างที่ซ้อนกัน - Inline modifier เช่น
(?i)เปลี่ยนพฤติกรรมเฉพาะบางส่วนของแพทเทิร์น
เคล็ดลับ
- ใน PHP ให้ครอบแพทเทิร์นด้วยตัวคั่น เช่น
/.../หรือ~...~และเลือกตัวที่ไม่มีอยู่ในแพทเทิร์น จะได้ไม่ต้อง escape - เปิด u เมื่อข้อความมีตัวอักษรที่มีเครื่องหมายเน้นเสียงหรืออักขระ CJK เพื่อให้
\wจับคู่ได้
คำถามที่พบบ่อย
› เครื่องมือนี้ต่างจากตัวทดสอบ regex ของ JavaScript อย่างไร?
หน้านี้รัน PCRE2 ซึ่งเป็นเอนจินเบื้องหลังฟังก์ชัน preg_ ของ PHP, Nginx, Apache และเครื่องมืออื่นอีกมาก โดยคอมไพล์เป็น WebAssembly รองรับไวยากรณ์ที่ JavaScript ไม่มี เช่น recursion ด้วย (?R), possessive quantifier อย่าง a++, atomic group, \K, กลุ่ม (?P<name>...) และ modifier x กับ U
› ต้องพิมพ์ตัวคั่นอย่าง /pattern/i ด้วยไหม?
ไม่ต้อง ป้อนเฉพาะแพทเทิร์น แล้วเปิด modifier ด้วยช่องทำเครื่องหมาย ใน PHP `preg_match('/\d+/i', $s)` เทียบเท่ากับแพทเทิร์น `\d+` ที่เปิด ไม่สนตัวพิมพ์เล็กใหญ่ ไว้
› ทำไมจึงได้ข้อความ "match limit exceeded"?
บางแพทเทิร์น เช่น ^(a+)+$ กับสตริงยาวที่ไม่ตรง จะเกิดการ backtrack จำนวนครั้งแบบเอกซ์โพเนนเชียล ตัวทดสอบจะหยุดหลังห้าล้านขั้นเพื่อให้หน้าเว็บยังตอบสนองได้ PHP มีกลไกป้องกันคล้ายกันคือ pcre.backtrack_limit และ preg_match จะคืนค่า false เมื่อถึงขีดจำกัดนี้
› ข้อความของฉันถูกอัปโหลดหรือไม่?
ไม่ โมดูล PCRE2 WebAssembly ถูกดาวน์โหลดเพียงครั้งเดียว และทุกอย่างทำงานในเบราว์เซอร์ของคุณ