ข้ามไปยังเนื้อหา
LeedyBox
สนับสนุน

ทดสอบ RegEx แทนที่ และสรุปไวยากรณ์

ทดสอบนิพจน์ปกติโดยไฮไลต์ส่วนที่ตรงและกลุ่มที่จับได้ ดูตัวอย่างการแทนที่ และคัดลอกแพตเทิร์นเป็นโค้ดสำหรับหกภาษา

แฟล็ก
ส่วนที่ตรง: 0

รายละเอียดส่วนที่ตรงและกลุ่มที่จับได้

สรุปแพตเทิร์น

คลิกแพตเทิร์นเพื่อโหลดพร้อมข้อความตัวอย่าง

สรุปไวยากรณ์

อักขระ

.อักขระใดก็ได้ยกเว้นการขึ้นบรรทัดใหม่ (เมื่อใช้ 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|ba หรือ b
(?=…) (?!…)ตามด้วย / ไม่ตามด้วย
(?<=…) (?<!…)นำหน้าด้วย / ไม่นำหน้าด้วย

การแทนที่

$1 $<name>ข้อความของกลุ่มที่มีหมายเลขหรือมีชื่อ
$& $$ส่วนที่ตรงทั้งหมด / อักขระ $

ตรวจสอบผลลัพธ์ก่อนใช้งาน เครื่องมือนี้ให้บริการตามสภาพที่เป็นอยู่โดยไม่มีการรับประกัน และผลลัพธ์อาจไม่ครบถ้วนหรือไม่ถูกต้อง ข้อกำหนดการให้บริการ

แพตเทิร์นทดสอบด้วยเอนจิน regex ของ JavaScript ไวยากรณ์และพฤติกรรมอาจต่างไปในภาษาและฐานข้อมูลอื่น แพตเทิร์นในสรุปเป็นตัวอย่างใช้งานจริง ไม่ใช่ตัวตรวจสอบที่สมบูรณ์

วิธีใช้

  1. ป้อนแพตเทิร์นใน “นิพจน์ปกติ” โดยไม่ต้องใส่เครื่องหมายทับที่ครอบและแฟล็ก แล้ววางข้อความลงใน “ข้อความทดสอบ” ส่วนที่ตรงจะถูกไฮไลต์และนับใน “ส่วนที่ตรง” ขณะที่คุณพิมพ์ หากต้องการเริ่มจากตัวอย่าง ให้คลิกแพตเทิร์นใน “สรุปแพตเทิร์น” ซึ่งจะแทนที่แพตเทิร์น แฟล็ก ข้อความทดสอบ และการตั้งค่าการแทนที่ปัจจุบัน
  2. เลือกแฟล็กที่ต้องการใน “แฟล็ก” และวางเมาส์เหนือตัวอักษรเพื่อดูว่าแฟล็กนั้นทำอะไร เมื่อเปิดหน้า g และ u จะเปิดอยู่ หากไม่มี g จะพบเฉพาะส่วนที่ตรงแรก และแทนที่เฉพาะส่วนแรกเท่านั้น
  3. อ่าน “รายละเอียดส่วนที่ตรงและกลุ่มที่จับได้” ซึ่งแสดงส่วนที่ตรงแต่ละรายการพร้อมตำแหน่ง และข้อความของทุกกลุ่มเป็น $1, $2 ไปตามลำดับ พร้อมชื่อของกลุ่มที่มีชื่อ เปิดแฟล็ก d เพื่อดูตำแหน่งเริ่มต้นและสิ้นสุดของแต่ละกลุ่มด้วย
  4. หากต้องการลองแทนที่ ให้เลือก “แทนที่ส่วนที่ตรงด้วย” แล้วพิมพ์ข้อความแทนที่ โดยใช้ $1 หรือ $<name> แทนกลุ่ม ข้อความที่เปลี่ยนแล้วจะแสดงใน “ผลการแทนที่” และ “คัดลอกผลลัพธ์” จะคัดลอกข้อความนั้น
  5. ใน “สร้างโค้ด” ให้เลือก 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{…} จึงควรทดสอบโค้ดกับข้อมูลของคุณเอง