ทดสอบ Regex
ทดสอบ Regex
ตัวทดสอบ Regex: รองรับการทดสอบนิพจน์ทั่วไปด้วยการจับคู่แบบเรียลไทม์ การควบคุมแฟลก กลุ่มที่จับได้ กลุ่มที่มีชื่อ และพรีวิวการแทนที่ทันที รวมการตรวจจับความเสี่ยงด้านประสิทธิภาพและการป้องกันหมดเวลา เหมาะสำหรับการตรวจสอบรูปแบบ การแยกข้อความ และการแทนที่เป็นกลุ่ม ทุกขั้นตอนทำงานอยู่ในเบราว์เซอร์ของคุณ
/
/g
ค้นหาทั้งหมด
ไม่สนตัวพิมพ์
หลายบรรทัด
จุดรวมขึ้นบรรทัดใหม่
โหมด Unicode
จับคู่ ณ ตำแหน่งปัจจุบัน
ข้อความทดสอบ
ข้อความแทนที่
ผลการจับคู่
ป้อนรูปแบบเพื่อเริ่มการจับคู่
ดูตัวอย่างการทดแทน
เริ่มต้นอย่างรวดเร็ว
สถานการณ์การใช้งานทั่วไป
แยก ID อีเมล วันที่ หรือโทเค็นแบบกำหนดเองออกจากบันทึกและข้อความ จากนั้นสามารถคัดลอก ดาวน์โหลด หรือส่งออกผลลัพธ์ได้ทันที
ตรวจสอบรูปแบบการป้อนข้อมูลของผู้ใช้ก่อนที่จะรวมเข้ากับโค้ด จากนั้นสามารถคัดลอก ดาวน์โหลด หรือส่งออกผลลัพธ์ได้ทันที
แบทช์แทนที่เนื้อหาโดยใช้กลุ่มการจับและกลุ่มที่มีชื่อ จากนั้นสามารถคัดลอก ดาวน์โหลด หรือส่งออกผลลัพธ์ได้ทันที
คำแนะนำการใช้งาน
ข้อจำกัดและความเข้ากันได้
ความเป็นส่วนตัวและความปลอดภัย
คำถามที่พบบ่อย
Regex หรือนิพจน์ทั่วไปคือภาษาสำหรับอธิบายรูปแบบของข้อความ คุณอาจมองว่าเป็น "การค้นหาขั้นสูง" คือไม่ได้ค้นหาคำที่ตายตัว แต่ค้นหาข้อความทุกส่วนที่ตรงตามกฎที่กำหนดไว้\n\nตัวอย่างเช่น \\d{4}-\\d{2}-\\d{2} ใช้จับวันที่ในรูปแบบ YYYY-MM-DD และ [\\w.]+@[\\w.]+ ใช้จับอีเมล Regex มักใช้กับงานค้นหาและดึงข้อมูลจากข้อความ ตรวจสอบรูปแบบข้อมูล เช่น เบอร์โทรหรืออีเมล และแทนที่ข้อความจำนวนมากในครั้งเดียว\n\nภาษาโปรแกรมแทบทุกภาษา เช่น JavaScript, Python, Java และ Go รวมถึงเครื่องมืออย่าง VS Code, grep และ sed ต่างรองรับ regex ด้วยไวยากรณ์ที่ใกล้เคียงกัน เครื่องมือนี้ใช้เอนจิน JavaScript RegExp เพื่อให้คุณทดลองและเรียนรู้ได้อย่างรวดเร็วบนเบราว์เซอร์
โดยค่าเริ่มต้น regex ของ JavaScript จะคืนค่าผลลัพธ์ที่ตรงกันเพียงรายการแรก นี่เป็นพฤติกรรมตามสเปกของภาษา ไม่ใช่ข้อจำกัดของเครื่องมือ ให้คลิกปุ่ม g ในแถบแฟล็กเพื่อเปิดการค้นหาแบบ global แล้วดูผลลัพธ์ที่ตรงกันทั้งหมด\n\nควรสังเกตความต่างระหว่าง g และ y ด้วย: g จะไล่สแกนข้อความทั้งหมดตั้งแต่ต้นจนจบ ส่วน y (sticky) บังคับให้การจับคู่ครั้งถัดไปต้องเริ่มตรงตำแหน่งที่การจับคู่ครั้งก่อนจบพอดี หากมีอักขระคั่นอยู่ y จะหยุดทันที โดยทั่วไปเปิด g อย่างเดียวก็มักเพียงพอแล้ว
สาเหตุที่พบบ่อยมี 4 แบบ:\n\n1. วงเล็บจับคู่ไม่ครบ: ทุก ( ต้องมี ) ที่เข้าคู่กัน และทุก [ ต้องมี ] ที่เข้าคู่กัน แม้ IDE บางตัวจะเติมให้อัตโนมัติ แต่ในเครื่องมือนี้คุณต้องตรวจให้ครบเอง\n2. วางตัวระบุจำนวนผิดตำแหน่ง: ตัวระบุจำนวนอย่าง *, +, ?, {n} ต้องตามหลังองค์ประกอบที่สามารถทำซ้ำได้ รูปแบบอย่าง *+ หรือ ?* ใช้ไม่ได้ ยกเว้นกรณีที่ ? ใช้ทำให้เป็นแบบ non-greedy เช่น *?\n3. escape ไม่สมบูรณ์: ถ้ามี \\ เดี่ยวอยู่ท้ายแพตเทิร์นจะถือว่าไม่ถูกต้อง เพราะต้องตามด้วยสัญลักษณ์ที่ต้องการ escape เช่น \\d, \\n หรือ \\\\.\n4. คุณสมบัติ Unicode ต้องใช้แฟล็ก u: รูปแบบอย่าง \\p{L} หรือ \\p{Script=Han} จะเกิดข้อผิดพลาดหากยังไม่ได้เปิดแฟล็ก u ให้กดปุ่ม u แล้วลองใหม่
นี่คือสัญลักษณ์อ้างอิงในข้อความแทนที่ที่ JavaScript String.prototype.replace() รองรับ:\n\n- $1, $2, ..., $99: อ้างอิงข้อความที่จับได้จากกลุ่มจับคู่ลำดับที่ n (...)\n- $&: ข้อความที่จับคู่ได้ทั้งหมด\n- $`: ข้อความก่อนตำแหน่งที่จับคู่\n- $': ข้อความหลังตำแหน่งที่จับคู่\n- ${name}: ข้อความที่จับได้จากกลุ่มแบบตั้งชื่อ (?<name>...)\n\nตัวอย่างเช่น แพตเทิร์น (\\w+)\\s(\\w+) เมื่อจับคู่กับ "hello world" แล้วแทนที่ด้วย $2-$1 จะได้ผลลัพธ์เป็น "world-hello" ถ้าต้องการใส่สัญลักษณ์ $ แบบตรงตัวในข้อความแทนที่ ให้ใช้ $$
การหมดเวลามักเกิดจากปัญหา "catastrophic backtracking" เมื่อเอนจิน regex เจอ quantifier ซ้อนกัน เช่น (a+)+b หรือเจอทางเลือกที่ซ้อนทับกัน มันจะลองย้อนกลับผ่านชุดค่าผสมจำนวนมหาศาล ทำให้เวลาในการจับคู่พุ่งสูงมาก\n\nตัวอย่างรูปแบบที่เสี่ยงคือ (a+)+, (.*?)*, (.+)+$ เป็นต้น วิธีลดปัญหา:\n1. แทนที่ . ด้วย character class ที่เฉพาะเจาะจงกว่า เช่น ใช้ [^\\s]+ แทน .+\n2. หลีกเลี่ยง quantifier ที่ซ้อนกัน เช่น เปลี่ยน (a+)+ เป็น a+\n3. ลดทางเลือกที่ซ้อนทับกัน เช่น เปลี่ยน (a|ab)+ เป็น a+b?\n\nหลังจากปรับแพตเทิร์นแล้ว ให้กดปุ่ม "ลองอีกครั้ง" ในส่วนผลการจับคู่ เครื่องมือนี้มีตัวป้องกันการหมดเวลา 4 วินาที จึงไม่ทำให้เบราว์เซอร์ค้าง
Regex เดียวกันอาจให้ผลต่างกันในแต่ละภาษา เพราะเอนจิน regex มีความต่างกันอยู่ 3 ด้านหลัก:\n\n1. การรองรับไวยากรณ์ไม่เท่ากัน: JavaScript ไม่รองรับแพตเทิร์นเรียกซ้ำแบบ PCRE (?R), เงื่อนไขสาขา (?(cond)yes|no) หรือ atomic group (?>...) โมดูล re ของ Python ก็ไม่รองรับเช่นกัน แต่ Java รองรับ atomic group ในขณะที่ไม่รองรับการเรียกซ้ำ\n2. การจัดการ Unicode ต่างกัน: Python 3 มอง \\w และ \\d เป็น Unicode โดยปริยาย ส่วน JavaScript ใช้แนวทางแบบ ASCII เป็นค่าเริ่มต้น เว้นแต่คุณจะเปิดแฟล็ก u เอง จึงอาจทำให้ \\w ไม่จับอักขระ CJK และ \\b ไม่ทำงานอย่างที่คาดกับข้อความเอเชียตะวันออก\n3. ความหมายของการขึ้นบรรทัดใหม่ต่างกัน: ทั้ง Python และ JavaScript จะไม่ให้ . จับ \\n ตามค่าเริ่มต้น ส่วน Java ต้องใช้ Pattern.DOTALL จึงจะได้พฤติกรรมคล้ายแฟล็ก s ของ JavaScript\n\nแนะนำให้ใช้เครื่องมือนี้เพื่อตรวจตรรกะอย่างรวดเร็วก่อน แล้วค่อยยืนยันผลสุดท้ายกับเอนจินของภาษาที่คุณจะใช้งานจริง