เครื่องมือทดสอบ Regex
สร้างและทดสอบ regular expression กับข้อความของคุณเองแบบเรียลไทม์ เห็นทุกผลการจับคู่ถูกไฮไลต์ ตรวจสอบ capture group และดูตัวอย่างการแทนที่ — ทั้งหมดภายในเบราว์เซอร์ของคุณ
/
/g
แฟล็ก
เคล็ดลับ: เปิดแฟล็ก g เพื่อแทนที่ทุกผลการจับคู่ ไม่ใช่แค่รายการแรก
วิธีใช้ เครื่องมือทดสอบ Regex
- 1
เขียนรูปแบบของคุณ
พิมพ์ regular expression ลงในช่องรูปแบบ แล้วสลับชิปแฟล็ก (g, i, m และอื่น ๆ) เพื่อกำหนดวิธีการจับคู่ได้อย่างละเอียด
- 2
เพิ่มข้อความทดสอบ
วางข้อความที่คุณต้องการค้นหาลงในช่อง “ข้อความทดสอบ” ผลการจับคู่จะถูกไฮไลต์ทันทีขณะที่คุณพิมพ์หรือแก้ไขรูปแบบ
- 3
ตรวจสอบผลการจับคู่
ดูผลการจับคู่แต่ละรายการ ตำแหน่งของมันในข้อความ และ capture group หรือกลุ่มที่มีชื่อในรายการผลลัพธ์ เพื่อยืนยันว่ารูปแบบทำงานตามที่คาดไว้
- 4
แทนที่หรือคัดลอก
ป้อนข้อความแทนที่เพื่อดูตัวอย่างการแทนที่ด้วยการอ้างอิงย้อนกลับแบบ $1 แล้วคัดลอกผลลัพธ์ไปวางในโค้ดหรือเอกสารของคุณได้ทันที
Regular Expression ในการใช้งานจริง: คู่มือภาคสนามสำหรับนักพัฒนา
regex อธิบายอะไรกันแน่
regular expression คือภาษารูปแบบ (pattern) ขนาดจิ๋วที่ใช้อธิบายชุดของสตริง แทนที่จะถามว่าข้อความเท่ากับค่าตายตัวค่าหนึ่งหรือไม่ คุณจะอธิบายรูปร่างของมันแทน — ลำดับของตัวเลข, คำที่ตามด้วยเครื่องหมาย at แล้วก็โดเมน, หรือตัวอักษรสามตัวแล้วตามด้วยขีด — จากนั้นเอนจินจะกวาดอ่านข้อความของคุณเพื่อหาทุกสตริงย่อยที่เข้ากับรูปร่างนั้น แนวคิดเพียงข้อเดียวนี้คือพลังเบื้องหลังการตรวจสอบความถูกต้องของข้อมูล การค้นหาและแทนที่ การแยกวิเคราะห์ล็อก การแบ่งโทเค็น และการดึงข้อมูล ในแทบทุกภาษาโปรแกรมและโปรแกรมแก้ไขข้อความ
เครื่องมือทดสอบนี้ใช้เอนจิน JavaScript (ECMAScript) ที่มีอยู่ในเบราว์เซอร์ของคุณ ซึ่งเป็นตัวเดียวกับที่ Node.js และเว็บแอปใช้ ดังนั้นรูปแบบที่จับคู่ได้ที่นี่จะทำงานเหมือนกันทุกประการในโค้ดแอปพลิเคชันของคุณ จุดนี้เองที่ทำให้มันเป็นแซนด์บ็อกซ์อันเที่ยงตรงสำหรับสร้างและดีบักรูปแบบ ก่อนที่คุณจะนำไปวางลงในโปรเจกต์จริง
character class และองค์ประกอบพื้นฐาน
ส่วนใหญ่ของรูปแบบก็คืออักขระตรงตัวที่จับคู่กับตัวมันเอง โดยมีโทเค็นพิเศษจำนวนหยิบมือแทรกอยู่เป็นระยะ character class (คลาสอักขระ) ที่เขียนไว้ในวงเล็บเหลี่ยมจะจับคู่กับอักขระตัวใดตัวหนึ่งจากชุดที่กำหนด ไม่ว่าจะเป็นช่วงของตัวอักษรพิมพ์เล็ก ชุดของสระ หรือตัวเลขหนึ่งหลัก อักขระย่อ backslash-d จับคู่กับตัวเลขหนึ่งตัว, backslash-w จับคู่กับอักขระคำ (ตัวอักษร ตัวเลข ขีดล่าง), backslash-s จับคู่กับช่องว่าง และจุด (dot) จับคู่กับอักขระใด ๆ ก็ได้ ยกเว้นอักขระขึ้นบรรทัดใหม่ เปลี่ยนอักขระย่อให้เป็นตัวพิมพ์ใหญ่เพื่อกลับด้านความหมายของมัน — backslash-D คืออักขระใด ๆ ที่ไม่ใช่ตัวเลข
สิ่งเหล่านี้คืออะตอมที่คุณนำมาประกอบกันขึ้นเป็นทุกสิ่งที่เหลือ ตัวอย่างเช่น รูปแบบสำหรับสีฐานสิบหก (hex color) ก็คือ anchor (ตัวยึดตำแหน่ง) ที่ตรึงไว้กับเครื่องหมายแฮช ตามด้วย character class ของเลขฐานสิบหกที่ทำซ้ำหลายครั้ง ส่วนรูปแบบสำหรับคำหนึ่งคำก็เป็นเพียง backslash-w ที่ทำซ้ำตั้งแต่หนึ่งครั้งขึ้นไป จงประกอบรูปแบบขึ้นจากชิ้นส่วนเล็ก ๆ เหล่านี้ แทนที่จะไขว่คว้าหานิพจน์ยักษ์เพียงตัวเดียวมาใช้
Anchor, Quantifier และ Alternation
anchor จับคู่กับตำแหน่ง ไม่ใช่กับตัวอักขระ เครื่องหมายแคเรต (caret) จับคู่กับจุดเริ่มต้นของสตริง (หรือจุดเริ่มต้นของบรรทัดเมื่อใช้แฟล็ก multiline) ส่วนเครื่องหมายดอลลาร์จับคู่กับจุดสิ้นสุด ขณะที่โทเค็นขอบเขตคำ backslash-b จับคู่กับรอยต่อระหว่างอักขระคำกับอักขระที่ไม่ใช่อักขระคำ ซึ่งเป็นวิธีที่ทำให้คุณจับคู่ได้ทั้งคำโดยไม่ไปโดนมันตอนที่ฝังอยู่ในคำที่ยาวกว่า ส่วน quantifier นั้นควบคุมการทำซ้ำ: เครื่องหมายบวกหมายถึงหนึ่งครั้งขึ้นไป, เครื่องหมายดอกจันหมายถึงศูนย์ครั้งขึ้นไป, และเครื่องหมายคำถามหมายถึงจะมีหรือไม่มีก็ได้ คุณยังระบุจำนวนที่แน่นอนหรือช่วงของจำนวนได้ด้วยรูปแบบวงเล็บปีกกา เมื่อคุณต้องการ เช่น ค่าที่ทำซ้ำสองถึงสี่ครั้ง
alternation หรือการสลับทางเลือกด้วยเครื่องหมายไปป์ (pipe) มีความหมายว่า “หรือ” — รูปแบบ cat หรือ dog จะจับคู่กับคำใดคำหนึ่งในสองคำนี้ ให้ห่อทางเลือกเหล่านั้นไว้ในวงเล็บเพื่อจำกัดขอบเขตของการเลือก โดยค่าเริ่มต้น quantifier จะเป็นแบบ greedy คือพยายามคว้าให้ได้มากที่สุดเท่าที่จะทำได้ ให้เติมเครื่องหมายคำถามต่อท้าย quantifier เพื่อเปลี่ยนมันให้เป็นแบบ lazy ที่จับคู่ให้น้อยที่สุดเท่าที่จะเป็นไปได้ ซึ่งนี่คือวิธีแก้ที่ใช้กันบ่อยเมื่อรูปแบบที่ตั้งใจจะคว้าแท็กเพียงอันเดียว กลับไปกลืนทุกอย่างยาวไปจนถึงแท็กตัวสุดท้ายในบรรทัดนั้น
capture group และวิธีใช้งาน
วงเล็บทำหน้าที่สองอย่างในคราวเดียว: มันจัดกลุ่มส่วนหนึ่งของรูปแบบ และจับเก็บสิ่งที่ส่วนนั้นจับคู่ได้ หลังเกิดการจับคู่ ชิ้นส่วนที่จับเก็บไว้จะพร้อมใช้งานในรูปของกลุ่มแบบมีหมายเลข — วงเล็บชุดแรกคือกลุ่มที่หนึ่ง ชุดถัดไปคือกลุ่มที่สอง — และรายการผลลัพธ์ที่นี่จะแสดงแต่ละกลุ่มให้เห็น เพื่อให้คุณยืนยันได้ว่ากำลังดึงชิ้นส่วนที่ตั้งใจไว้ออกมาได้อย่างแม่นยำ รูปแบบสำหรับสตริงที่มีหน้าตาคล้ายอีเมล ซึ่งมีวงเล็บแยกครอบส่วนชื่อผู้ใช้ (local part), โดเมน, และส่วนขยายเอาไว้ จะช่วยให้คุณอ่านสามชิ้นส่วนนั้นกลับคืนมาได้ทีละชิ้น
กลุ่มที่มีชื่อ (named group) ซึ่งเขียนด้วยไวยากรณ์ที่วางชื่อไว้ในวงเล็บแหลมทันทีหลังวงเล็บเปิด จะมอบป้ายกำกับที่อ่านง่ายให้กับการจับเก็บเหล่านั้นแทนที่จะเป็นเพียงตัวเลขโดด ๆ และจะปรากฏอยู่ในส่วนของตัวเอง เมื่อคุณต้องการเพียงการจัดกลุ่มโดยไม่ต้องแบกภาระส่วนเกินของการจับเก็บ non-capturing group (กลุ่มแบบไม่จับเก็บ) — วงเล็บเปิดที่ตามด้วยเครื่องหมายคำถามและเครื่องหมายโคลอน — จะช่วยให้หมายเลขกลุ่มของคุณสะอาดเป็นระเบียบ และการจับเก็บเหล่านี้เองคือสิ่งที่ขั้นตอนการแทนที่ของคุณจะอ้างอิงถึง
แฟล็กเปลี่ยนการจับคู่ทั้งหมด
แฟล็กคือตัวปรับแต่งที่เปลี่ยนวิธีการนำรูปแบบทั้งหมดไปใช้งาน global จะค้นหาทุกผลการจับคู่แทนที่จะหยุดที่รายการแรก ซึ่งจำเป็นอย่างยิ่งต่อการแทนที่ทุกตำแหน่งที่พบ ไม่ใช่แค่ตำแหน่งเดียว ignore-case ทำให้ตัวอักษรจับคู่กันได้โดยไม่สนใจตัวพิมพ์เล็ก-ใหญ่ ส่วน multiline จะนิยาม anchor อย่างเครื่องหมายแคเรตและเครื่องหมายดอลลาร์เสียใหม่ ให้จับคู่ที่ทุกจุดขึ้นบรรทัดใหม่ แทนที่จะจับคู่เฉพาะที่จุดเริ่มต้นและจุดสิ้นสุดสุดขอบของอินพุตเท่านั้น
แฟล็กที่เหลือนั้นขึ้นอยู่กับสถานการณ์ แต่ก็สำคัญไม่แพ้กัน dotall ทำให้จุด (dot) จับคู่กับอักขระขึ้นบรรทัดใหม่ได้ด้วย รูปแบบจึงทอดข้ามหลายบรรทัดได้ unicode เปิดการจัดการ Unicode เต็มรูปแบบสำหรับโค้ดพอยต์ (code point) ที่อยู่นอกช่วงพื้นฐาน และสำหรับ Unicode property escape ส่วน sticky จะยึดแต่ละผลการจับคู่ไว้กับตำแหน่งที่อยู่ถัดจากผลการจับคู่ครั้งก่อนหน้าทันที ซึ่งเป็นวิธีที่ตัวแบ่งโทเค็น (tokenizer) ใช้เดินไล่ไปตามอินพุตโดยไม่กระโดดข้ามไปข้างหน้า ลองสลับเปิด-ปิดแฟล็กที่นี่แล้วเฝ้าดูผลการจับคู่ที่ไฮไลต์เปลี่ยนแปลงไป เพื่อสร้างความเข้าใจเชิงสัญชาตญาณต่อแฟล็กแต่ละตัว
รูปแบบที่คุณจะได้เขียนอยู่เป็นประจำ
มีรูปแบบอยู่ไม่กี่อย่างที่โผล่มาให้เห็นครั้งแล้วครั้งเล่า การดึงจำนวนเต็มทั้งหมดออกจากก้อนข้อความก็คือ backslash-d ที่ทำซ้ำตั้งแต่หนึ่งครั้งขึ้นไปพร้อมกับแฟล็ก global การตรวจอีเมลแบบหยาบ ๆ ก็คืออักขระคำตั้งแต่หนึ่งตัวขึ้นไป, เครื่องหมาย at, อักขระคำอีกตั้งแต่หนึ่งตัวขึ้นไป, จุดแบบตรงตัว, แล้วก็ตัวอักษรสั้น ๆ อีกชุดหนึ่ง — ซึ่งเพียงพอสำหรับเป็นตัวกรองตรวจเช็คเบื้องต้นแบบเร็ว ๆ แม้จะหละหลวมโดยตั้งใจก็ตาม การตัดหรือยุบช่องว่างที่ติดกันยาว ๆ การตรวจสอบ slug ที่ประกอบด้วยตัวอักษรพิมพ์เล็กและเครื่องหมายขีด และการดึงเนื้อหาที่อยู่ระหว่างตัวคั่นสองตัว ล้วนเป็นงานประจำวันทั้งสิ้น
จงต้านทานความอยากที่จะตรวจสอบรูปแบบที่ซับซ้อนอย่างแท้จริงด้วยรูปแบบขนาดมหึมาเพียงตัวเดียว โดยเฉพาะไวยากรณ์ของอีเมลและ URL นั้นขึ้นชื่อเรื่องความยากที่จะจับให้ครบถ้วนสมบูรณ์ด้วย regex สำหรับกรณีเหล่านั้น การใช้รูปแบบหลวม ๆ บวกกับ parser ตัวจริงหรือไลบรารีเฉพาะทาง มักจะดีกว่านิพจน์ที่อ่านไม่รู้เรื่องซึ่งคุณจะไม่กล้าแตะต้องมันในอีกหกเดือนข้างหน้า
การย้อนรอยแบบหายนะ (catastrophic backtracking) และวิธีหลีกเลี่ยง
การย้อนรอย (backtracking) ของเอนจินคือสิ่งที่ทำให้ regex ทรงพลัง แต่มันก็ทำให้รูปแบบหนึ่ง “ระเบิด” ได้เช่นกัน เมื่อสองส่วนของรูปแบบที่มี quantifier กำกับ สามารถจับคู่กับอักขระชุดเดียวกันได้ในหลายวิธีที่ซ้อนเหลื่อมกัน — ตัวอย่างคลาสสิกคือกลุ่มที่ถูกทำซ้ำในตัวมันเอง ซึ่งการทำซ้ำชั้นในและชั้นนอกแย่งกันทำงาน — เอนจินอาจลองชุดความเป็นไปได้จำนวนมหาศาลระดับดาราศาสตร์กับสตริงที่สุดท้ายแล้วก็จับคู่ไม่สำเร็จ บนอินพุตที่ยาว สิ่งนี้อาจค้างไปหลายวินาทีหรือค้างสนิทไปเลยทั้งหมด และบนเซิร์ฟเวอร์มันจะกลายเป็นช่องทางโจมตีแบบปฏิเสธการให้บริการ (denial-of-service) ที่รู้จักกันในชื่อ ReDoS
แนวป้องกันนั้นเป็นเรื่องของโครงสร้าง หลีกเลี่ยงการซ้อน quantifier ตัวหนึ่งไว้ในอีกตัวหนึ่งที่จับคู่สิ่งเดียวกันได้, เลือกใช้ character class ที่เจาะจงกว่าแทนการใช้จุดที่อนุญาตอย่างกว้างขวาง เพื่อให้แต่ละขั้นตอนมีวิธีกลืนกินอินพุตได้เพียงทางเดียว, และยึดรูปแบบด้วย anchor เมื่อทำได้ หากคุณจำเป็นต้องทดสอบรูปแบบที่มีความเสี่ยง ให้ทดสอบที่นี่กับสตริงกรณีเลวร้ายที่สุดแบบสมจริงเสียก่อน ที่ซึ่งรูปแบบที่หลุดจากการควบคุมจะทำให้คุณเสียเพียงแท็บเบราว์เซอร์ไปหนึ่งแท็บ แทนที่จะทำให้ระบบโปรดักชันล่ม
การดูตัวอย่างการแทนที่อย่างปลอดภัย
การค้นหาและแทนที่คือจุดที่ regex ให้ผลคุ้มค่าในแต่ละวัน และช่องแทนที่ก็ช่วยให้คุณดูตัวอย่างผลลัพธ์ได้ก่อนจะนำไปใช้จริงที่ใดก็ตาม อ้างอิงถึง capture group ของคุณในข้อความแทนที่ด้วยเครื่องหมายดอลลาร์ตามด้วยหมายเลขกลุ่ม — ดอลลาร์-หนึ่ง (dollar-one) จะแทรกสิ่งที่กลุ่มแรกจับคู่ได้ลงไป — คุณจึงสลับลำดับวันที่ จัดรูปแบบชื่อใหม่ หรือห่อผลการจับคู่ไว้ในมาร์กอัปได้ พึงจำไว้ว่าหากไม่มีแฟล็ก global จะมีเพียงผลการจับคู่แรกเท่านั้นที่ถูกแทนที่ ให้เปิด global เพื่อแปลงทุกตำแหน่งที่พบ
ทุกอย่างทำงานในเครื่องบนเบราว์เซอร์ของคุณโดยใช้เอนจินที่มีอยู่ในตัว ดังนั้นสิ่งที่คุณวางลงไป — ไม่ว่าจะเป็นบรรทัดล็อก ซอร์สโค้ด หรือข้อมูลลูกค้า — จะไม่ถูกอัปโหลด บันทึก หรือจัดเก็บไว้ที่ใด จุดนี้ทำให้เครื่องมือทดสอบนี้เป็นพื้นที่ปลอดภัยสำหรับลองปรับแก้ซ้ำไปมาบนตัวอย่างข้อมูลจากโลกจริง จนกว่าทั้งผลการจับคู่และผลลัพธ์การแทนที่จะถูกต้องเป๊ะทั้งคู่ แล้วจึงคัดลอกรูปแบบที่เสร็จสมบูรณ์ไปวางในโค้ดของคุณได้อย่างมั่นใจ
คำถามที่พบบ่อย
Regular expression คืออะไร
เครื่องมือนี้ใช้ regex แบบใด
แฟล็กแต่ละตัวหมายความว่าอย่างไร
capture group ทำงานอย่างไร
ข้อมูลของฉันถูกส่งไปยังเซิร์ฟเวอร์หรือไม่
เครื่องมือที่เกี่ยวข้อง
ทำงานต่อด้วยเครื่องมือที่มีประโยชน์เหล่านี้