โปรแกรมเมอร์ส่วนใหญ่มักมีจุดบอด พวกเขาสามารถดีบั๊ก distributed system หรือต่อสู้กับ framework ใหม่ๆ ได้อย่างสบายๆ แต่กลับยอมเสียเวลาถึงยี่สิบนาทีเพื่อแก้ไขข้อความด้วยมือในสิ่งที่ควรจะใช้เวลาเพียงสิบวินาที เหตุผลนั้นเหมือนเดิมเสมอ นั่นคือ regular expressions ดูเหมือนสัญญาณรบกวน (line noise) รูปแบบทั่วไปคือกลุ่มของเครื่องหมายสแลช (slash), แบ็กสแลช (backslash) และเครื่องหมายวรรคตอนที่ดูเหมือนถูกส่งมาจากโมเด็มในยุค 1990 ความวุ่นวายทางสายตานี้ทำให้คนที่มีความสามารถต้องถอยห่างจากทักษะที่มีค่าอย่างแท้จริง

ข่าวดีก็คือ regex ไม่ได้ยาก มันแค่ "อัดแน่น" สัญลักษณ์ต่างๆ บรรจุความหมายมหาศาลไว้ในพื้นที่เล็กๆ ดังนั้นสายตาของคุณจึงมองเห็นความสุ่มสาดในจุดที่จริงๆ แล้วมันคือคำอธิบายที่แม่นยำมาก เมื่อคุณมีโมเดลทางความคิดที่ถูกต้อง คุณจะเลิกพยายามถอดรหัสสัญลักษณ์ทีละตัว แต่จะเริ่มอ่าน "รูปร่าง" ที่มันอธิบายแทน เมื่อคุณทำเช่นนั้น ความวุ่นวายจะหายไปโดยสิ้นเชิง

รูปแบบ ไม่ใช่โปรแกรม

การเปลี่ยนแปลงที่สำคัญคือการเข้าใจว่าจริงๆ แล้ว regular expression คืออะไร โค้ดส่วนใหญ่ที่คุณเขียนเป็นแบบ procedural: ทำสิ่งนี้ แล้วทำสิ่งนั้น ตรวจสอบเงื่อนไขนี้ แล้ววนลูปอีกครั้ง แต่ regex ไม่ใช่ขั้นตอนการทำงาน (procedure) มันคือรูปแบบคงที่ (static pattern) ที่อธิบายว่าข้อความควรจะมีลักษณะอย่างไร คุณไม่ได้กำลังเขียนคำสั่งว่าจะค้นหาอย่างไร แต่คุณกำลังส่ง "ภาพร่าง" ให้กับ matching engine และปล่อยให้มันจัดการส่วนที่เหลือเอง

ลองคิดว่ามันคือการอธิบายรูปร่างด้วยภาษาอังกฤษง่ายๆ:

  • ตัวเลขห้าหลัก
  • ที่อยู่อีเมล
  • บรรทัดที่เริ่มต้นด้วยตัวอักษรพิมพ์ใหญ่

นั่นคือทั้งหมดที่ regex ทำ เพียงแต่ใช้ชุดตัวอักษรที่ถูกบีบอัด เมื่อคุณเห็น \d{5} คุณไม่ได้เห็นเวทมนตร์ แต่คุณกำลังเห็น "ตัวเลขหนึ่งตัว จำนวนห้าครั้ง" เมื่อคุณเห็น ^[A-Z] คุณกำลังเห็น "จุดเริ่มต้นของบรรทัด ตามด้วยตัวอักษรพิมพ์ใหญ่หนึ่งตัว" ทักษะนี้ไม่ใช่การท่องจำ แต่คือการเรียนรู้ที่จะเหลือบมองรูปแบบแล้วแปลกลับมาเป็นคำอธิบายภาษาอังกฤษง่ายๆ นั้น เมื่อคุณสามารถแปลได้ ความรู้สึกกลัวก็จะหายไป

เวลาที่เสียไปจริงๆ เกิดจากอะไร

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

หากคุณต้องการค้นหาวันที่ทุกแห่งในเอกสารความยาวสองร้อยหน้า regex จะหาพวกมันพบในการทำงานเพียงรอบเดียว หากคุณต้องการตรวจสอบว่าผู้ใช้พิมพ์ URL จริงหรือไม่ก่อนที่แอปพลิเคชันของคุณจะยอมรับ รูปแบบ (pattern) สามารถบังคับใช้รูปร่างพื้นฐานของที่อยู่นั้นได้ หากคุณกำลังทำความสะอาดข้อความที่คัดลอกมาจากเว็บไซต์และต้องการยุบช่องว่างหลายช่องให้เหลือเพียงช่องเดียว regex สำหรับการแทนที่ (replacement regex) จะใช้ตัวอักษรเพียงสี่ตัว หากคุณกำลังดึงข้อมูลจาก server logs ที่ยุ่งเหยิง regex มักจะเป็นสะพานเชื่อมเดียวที่สมเหตุสมผลระหว่างข้อความที่ไม่มีโครงสร้าง (unstructured text) และรายงานที่มีโครงสร้าง (structured report)

นี่คือกฎง่ายๆ ที่ควรนำไปใช้: หากคุณกำลังจะทำการแก้ไขข้อความด้วยมือถึงห้าสิบครั้ง ให้หยุดเสียก่อน แล้วเขียน pattern แทน การทำซ้ำด้วยมือไม่เพียงแต่ช้า แต่ยังไม่น่าเชื่อถืออีกด้วย คุณอาจจะพลาดครั้งที่สี่สิบเจ็ด หรือพิมพ์ผิดในครั้งที่สามสิบสาม Pattern จะทำงานให้คุณเพียงครั้งเดียวอย่างถูกต้อง และมันยังเป็นเอกสารบันทึกกฎที่คุณกำลังนำมาใช้ตั้งแต่แรกด้วย

วงจรการเรียนรู้ที่ได้ผล

อย่าพยายามพิมพ์ pattern ที่สมบูรณ์แบบจากความจำ เพราะนั่นคือวิธีที่ความหงุดหงิดจะก่อตัวขึ้น แต่ให้ทำตามวงจรที่กระชับซึ่งจะช่วยให้คุณก้าวหน้าต่อไปได้โดยไม่หลงทางในไวยากรณ์ (syntax)

  1. อธิบายรูปร่างด้วยคำพูด ก่อนที่คุณจะแตะต้องตัวอักษรพิเศษ ให้เขียนสิ่งที่คุณต้องการลงไปให้ชัดเจน "ตัวเลขสี่หลัก ตามด้วยเครื่องหมายขีด ตามด้วยตัวเลขสองหลัก ตามด้วยเครื่องหมายขีด และตามด้วยตัวเลขสองหลัก" หากคุณไม่สามารถพูดมันออกมาให้ชัดเจนได้ คุณก็ไม่สามารถสร้าง pattern ได้
  2. สร้างร่างแรก เปลี่ยนคำอธิบายของคุณให้เป็น pattern พื้นฐานโดยใช้สัญลักษณ์ที่กว้างที่สุดเท่าที่เป็นไปได้ อย่ากังวลเรื่องความสมบูรณ์แบบ คุณกำลังสร้างต้นแบบ (prototype),