ทดสอบ RegEx แทนที่ และสรุปไวยากรณ์
ทดสอบนิพจน์ปกติโดยไฮไลต์ส่วนที่ตรงและกลุ่มที่จับได้ ดูตัวอย่างการแทนที่ และคัดลอกแพตเทิร์นเป็นโค้ดสำหรับหกภาษา
รายละเอียดส่วนที่ตรงและกลุ่มที่จับได้
สรุปแพตเทิร์น
คลิกแพตเทิร์นเพื่อโหลดพร้อมข้อความตัวอย่าง
สรุปไวยากรณ์
อักขระ
| . | อักขระใดก็ได้ยกเว้นการขึ้นบรรทัดใหม่ (เมื่อใช้ s: รวมการขึ้นบรรทัดใหม่) |
| \d \D | ตัวเลข 0–9 / ไม่ใช่ตัวเลข |
| \w \W | อักขระคำ (A–Z, a–z, 0–9, _) / ไม่ใช่อักขระคำ |
| \s \S | ช่องว่าง / ไม่ใช่ช่องว่าง |
| [abc] [^abc] | หนึ่งใน a, b, c / อะไรก็ได้ยกเว้น a, b, c |
| [a-z] | อักขระในช่วง a ถึง z |
| \p{L} | ตัวอักษรของทุกภาษา (ต้องใช้แฟล็ก u) |
| \. \\ \( | escape อักขระพิเศษเพื่อค้นหาตามตัวอักษร |
ตัวระบุจำนวน
| * + ? | 0 ครั้งขึ้นไป / 1 ครั้งขึ้นไป / 0 หรือ 1 ครั้ง |
| {n} {n,} {n,m} | n ครั้งพอดี / n ครั้งขึ้นไป / ระหว่าง n ถึง m ครั้ง |
| *? +? {n,m}? | แบบขี้เกียจ: ตรงให้น้อยที่สุดเท่าที่ทำได้ |
ตัวยึดตำแหน่ง
| ^ $ | ต้น / ท้ายข้อความ (แต่ละบรรทัดเมื่อใช้ m) |
| \b \B | ขอบคำ / ไม่ใช่ขอบคำ |
กลุ่มและ lookaround
| (…) | กลุ่มที่จับ ใช้เป็น $1, $2 … |
| (?:…) | กลุ่มที่ไม่จับ |
| (?<name>…) | กลุ่มที่มีชื่อ ใช้เป็น $<name> |
| \1 \k<name> | อ้างอิงย้อนกลับ: ข้อความเดียวกับที่กลุ่มจับได้ |
| a|b | a หรือ b |
| (?=…) (?!…) | ตามด้วย / ไม่ตามด้วย |
| (?<=…) (?<!…) | นำหน้าด้วย / ไม่นำหน้าด้วย |
การแทนที่
| $1 $<name> | ข้อความของกลุ่มที่มีหมายเลขหรือมีชื่อ |
| $& $$ | ส่วนที่ตรงทั้งหมด / อักขระ $ |
วิธีใช้
- ป้อนแพตเทิร์นใน “นิพจน์ปกติ” โดยไม่ต้องใส่เครื่องหมายทับที่ครอบและแฟล็ก แล้ววางข้อความลงใน “ข้อความทดสอบ” ส่วนที่ตรงจะถูกไฮไลต์และนับใน “ส่วนที่ตรง” ขณะที่คุณพิมพ์ หากต้องการเริ่มจากตัวอย่าง ให้คลิกแพตเทิร์นใน “สรุปแพตเทิร์น” ซึ่งจะแทนที่แพตเทิร์น แฟล็ก ข้อความทดสอบ และการตั้งค่าการแทนที่ปัจจุบัน
- เลือกแฟล็กที่ต้องการใน “แฟล็ก” และวางเมาส์เหนือตัวอักษรเพื่อดูว่าแฟล็กนั้นทำอะไร เมื่อเปิดหน้า g และ u จะเปิดอยู่ หากไม่มี g จะพบเฉพาะส่วนที่ตรงแรก และแทนที่เฉพาะส่วนแรกเท่านั้น
- อ่าน “รายละเอียดส่วนที่ตรงและกลุ่มที่จับได้” ซึ่งแสดงส่วนที่ตรงแต่ละรายการพร้อมตำแหน่ง และข้อความของทุกกลุ่มเป็น $1, $2 ไปตามลำดับ พร้อมชื่อของกลุ่มที่มีชื่อ เปิดแฟล็ก d เพื่อดูตำแหน่งเริ่มต้นและสิ้นสุดของแต่ละกลุ่มด้วย
- หากต้องการลองแทนที่ ให้เลือก “แทนที่ส่วนที่ตรงด้วย” แล้วพิมพ์ข้อความแทนที่ โดยใช้ $1 หรือ $<name> แทนกลุ่ม ข้อความที่เปลี่ยนแล้วจะแสดงใน “ผลการแทนที่” และ “คัดลอกผลลัพธ์” จะคัดลอกข้อความนั้น
- ใน “สร้างโค้ด” ให้เลือก JavaScript, Python, Java, PHP, Go หรือ C# แล้วคลิก “คัดลอกโค้ด” โค้ดจะรวมการแทนที่ไว้ด้วยเมื่อเลือก “แทนที่ส่วนที่ตรงด้วย” อยู่ ส่วน “คัดลอกเป็น /แพตเทิร์น/แฟล็ก” จะคัดลอกแพตเทิร์นเป็นลิเทอรัล regex ของ JavaScript
คำถามที่พบบ่อย
ข้อความที่ฉันทดสอบถูกส่งไปที่ใดหรือไม่
ไม่ แพตเทิร์นและข้อความทดสอบจะถูกจับคู่ในเบราว์เซอร์ของคุณด้วยเอนจิน regex ของ JavaScript ที่มีอยู่ในเบราว์เซอร์ และไม่ถูกอัปโหลดไปยัง LeedyBox เครื่องมือนี้ก็ไม่ได้บันทึกไว้เช่นกัน
ทำไมแพตเทิร์นจึงจับข้อความได้มากกว่าที่คาดไว้
แพตเทิร์นจะตรงกับทุกตำแหน่งที่เข้าเงื่อนไข \d{3} จึงพบ 123 ภายใน 12345 ด้วย ให้ใส่ \b ทั้งสองด้านเพื่อจับทั้งคำหรือทั้งตัวเลข หรือใช้ ^ และ $ เพื่อบังคับให้ข้อความทั้งหมดต้องตรง (หรือทีละบรรทัดเมื่อเปิด m) อย่างที่แพตเทิร์นรหัสผ่านใน “สรุปแพตเทิร์น” ทำ \b อาศัยอักขระคำของ \w (A–Z, a–z, 0–9 และ _) และถือว่าตัวอักษรอย่าง é, 한 หรืออักษรไทยไม่ใช่อักขระคำ \bcafé\b จึงไม่ตรงกับ café เมื่อมีช่องว่างตามหลัง นอกจากนี้ตัวระบุจำนวนอย่าง + และ * ยังเป็นแบบ greedy กับข้อความ <b>x</b> แพตเทิร์น <.+> จะตรงทั้งสตริง ขณะที่ <.+?> หรือ <[^>]+> จะหยุดที่ > ตัวแรก
ทำไมแพตเทิร์นที่ใช้ได้ใน Python, PHP หรือ Java จึงแสดง “ข้อผิดพลาด RegEx” ที่นี่
หน้านี้ใช้เอนจินของ JavaScript ซึ่งไม่รับไวยากรณ์บางอย่างจากเอนจินอื่น เช่น กลุ่มที่มีชื่อแบบ (?P<name>…) แฟล็กในแพตเทิร์นอย่าง (?i) ที่ต้นแพตเทิร์น กลุ่มแบบ atomic (?>…) และตัวระบุจำนวนแบบ possessive อย่าง a++ ให้เขียนกลุ่มที่มีชื่อเป็น (?<name>…) และใช้ช่องทำเครื่องหมายใน “แฟล็ก” แทนแฟล็กในแพตเทิร์น เมื่อเปิดแฟล็ก u JavaScript ยังเข้มงวดเรื่อง escape มากขึ้น \# เป็นข้อผิดพลาด และ \- นอกวงเล็บเหลี่ยมก็เช่นกัน ให้ลบแบ็กสแลชออกหรือปิด u
ทำไม \p{L} จึงไม่ตรงกับตัวอักษร หรืออีโมจิจึงนับเป็นสองอักขระ
คลาสคุณสมบัติ Unicode อย่าง \p{L} ต้องใช้แฟล็ก u หากไม่มีแฟล็กนี้ JavaScript จะอ่าน \p{L} เป็นข้อความ p{L} ตามตัวอักษร และ . จะตรงกับอักขระที่อยู่นอก Basic Multilingual Plane ได้เพียงครึ่งตัว เช่น อีโมจิจำนวนมาก การโหลดแพตเทิร์นจาก “สรุปแพตเทิร์น” จะโหลดแฟล็กของแพตเทิร์นนั้นด้วย และทุกแพตเทิร์นยกเว้น “อักขระพิเศษ” จะปิด u ไว้ จึงควรตรวจ “แฟล็ก” ก่อนเพิ่มไวยากรณ์แบบนี้ แม้เปิด u แล้ว . ก็ยังตรงกับโค้ดพอยต์เดียว และอีโมจิบางตัว เช่น ธง หรือนิ้วโป้งที่มีสีผิว ประกอบด้วยโค้ดพอยต์ตั้งแต่สองตัวขึ้นไป ในภาษาไทย สระบน สระล่าง และวรรณยุกต์ก็เป็นโค้ดพอยต์แยกจากพยัญชนะ เช่น “ที่” มีสามโค้ดพอยต์ จึงต้องใช้ . สามตัวจึงจะตรงทั้งหมด ตำแหน่งในรายละเอียดส่วนที่ตรงนับเป็นหน่วยโค้ด UTF-16 ตามแบบ JavaScript อักขระที่อยู่นอก Basic Multilingual Plane จึงกินสองตำแหน่งแม้จะเปิด u
ทำไม \n ในข้อความแทนที่จึงไม่ขึ้นบรรทัดใหม่
ข้อความแทนที่เป็นไปตามกฎของ replace() ใน JavaScript ซึ่งมีเฉพาะลำดับที่ขึ้นต้นด้วย $ ที่มีความหมายพิเศษ \n และ \t จึงถูกแทรกเป็นแบ็กสแลชตามด้วยตัวอักษร ไม่ใช่การขึ้นบรรทัดใหม่หรือแท็บ ช่องนี้รับข้อความได้บรรทัดเดียว จึงป้อนการขึ้นบรรทัดใหม่ที่นี่ไม่ได้ ให้เพิ่มในโค้ดที่สร้างขึ้นแทน หากต้องการลบส่วนที่ตรง ให้เลือก “แทนที่ส่วนที่ตรงด้วย” แล้วเว้นช่องว่างไว้ อย่างที่แพตเทิร์น “ลบแท็ก HTML/XML” ใน “สรุปแพตเทิร์น” ทำ
จะเกิดอะไรขึ้นหากแพตเทิร์นทำงานช้ามากหรือพบส่วนที่ตรงจำนวนมาก
เมื่อเบราว์เซอร์อนุญาตให้ใช้ Web Worker การจับคู่จะทำงานใน worker เบื้องหลังและถูกหยุดหลังจาก 2 วินาที แพตเทิร์นที่เกิด catastrophic backtracking เช่น (a+)+$ กับตัว a เรียงกันยาวที่ตามด้วยอักขระอื่น จึงแสดงข้อความแจ้งแทนที่จะทำให้หน้าค้าง ตัวเลขใน “ส่วนที่ตรง” นับทุกส่วนที่ตรง แต่จะไฮไลต์และแสดงในรายละเอียดเฉพาะ 1,000 รายการแรก
นำโค้ดที่สร้างขึ้นไปวางในโปรเจกต์ได้เลยหรือไม่
ให้ใช้เป็นจุดเริ่มต้น ตัวสร้างจะเขียนแพตเทิร์นเป็นลิเทอรัล regex ใน JavaScript และเป็นสตริงในภาษาอื่น เขียนกลุ่มที่มีชื่อและการอ้างอิงในข้อความแทนที่ใหม่เมื่อไวยากรณ์ต่างกัน เช่น (?P<name>…) และ \g<1> ใน Python แปลงแฟล็ก i, m และ s ให้ตรงกับแต่ละภาษา และคาดว่าข้อมูลเข้าของคุณอยู่ในตัวแปรชื่อ text หากแพตเทิร์นมีเครื่องหมายคำพูดหรือเครื่องหมายทับ ให้ตรวจสอบว่าโค้ดที่ได้ escape อักขระเหล่านั้นถูกต้อง อย่างไรก็ตาม เอนจินแต่ละตัวยังคงต่างกัน แพ็กเกจ regexp ของ Go ใช้ไวยากรณ์ RE2 ซึ่งไม่รองรับ lookaround และการอ้างอิงย้อนกลับ และโมดูล re มาตรฐานของ Python ไม่รองรับคลาส \p{…} จึงควรทดสอบโค้ดกับข้อมูลของคุณเอง