Regular Expression คืออะไร
Regular Expression (หรือ regex) คือ string pattern ที่ใช้แสดงรูปแบบของคำ หรือข้อความใด ๆ โดยตัว regex เองนั้นมีพื้นฐานมาจากทฤษฏีทางคณิตศาสตร์เพื่อใช้ในการเปรียบเทียบข้อความนั้น ๆ กับ pattern ที่กำหนดว่าสอดคล้องกันหรือไม่ (match)
Regular Expression Engine
Programming lanugage ปัจจุบันจะสนับสนุนการใช้งาน regex แล้ว แต่ปัญหาหนึ่งคือการเข้ากันได้ของ regex ในแต่ละภาษา ไม่ว่าจะเป็นความสามารถ และวิธีการเขียนที่แตกต่างกัน ดังนั้น regex ในภาษาหนึ่งจะไม่สามารถนำไปใช้กับอีกภาษาหนึ่งได้ทั้งหมด จะต้องมีการแก้ไขบางส่วนเพื่อให้สอดคล้องกับ engine ในภาษานั้น ๆ
เราจะใช้ Regular Expression ตอนไหน
ลองนึกถึงสถานการณ์ที่เรามีข้อความขนาดเป็นแสน ๆ ตัวอักษร และเราต้องการดูว่ามีคำซักคำในข้อความนั้นหรือไม่ บางคนอาจจะนึกถึงการใช้ strpos() แต่ลองนึกต่อไปอีกนิดว่า ถ้าคำที่เราต้องการหามันซับซ้อนกว่าที่เราจะทำแบบนั้นได้ล่ะ เช่น เราต้องการหาว่ามีคำที่ขึ้นต้นด้วย c และลงท้ายด้วย e หรือไม่ กว่าเราจะทำ strpos เช็คดูทีละคำเสร็จคงจะหมดแรงพอดี ลองพิจารณาถึง regex ต่อไปนี้ \bc\w+e\b ที่สามารถหาคำที่ต้องการได้โดยคำสั่งเดียวดูว่าชีวิตจะง่ายขึ้นขนาดไหน
Regular Expression ใน PHP
ใน PHP นั้น เราสามารถเขียน regex ได้ 2 รูปแบบ คือ POSIX และ PCRE (Perl-Compatible) โดยส่วนตัวผมแล้ว ผมนิยมเขียนแบบ PCRE มากกว่าครับ ในส่วนของ POSIX Regex นั้น คำสั่งจะขึ้นต้นด้วย ereg_ ส่วน PCRE คำสั่งจะขึ้นต้นด้วย preg_ ครับ รูปแบบการเขียนของทั้งสองแบบจะแตกต่างกันเล็กน้อย แต่เมื่อเราเลือกที่จะเขียนแบบไหนแล้ว ก็แนะนำให้เขียนไปแบบเดียวให้ชำนาญครับ ไม่งั้นเดี๋ยวจะตีกันยุ่ง
Regular Expression ใน Javascript
ใน javascript ก็สามารถเขียนได้ 2 รูปแบบเช่นกัน คือ ผ่าน RegExp Object หรือ ผ่าน literal syntax เช่น /pattern/ (ไม่ต้องมีเครื่องหมายคำพูดครอบ เพราะไม่ใช่ String) ส่วนตัวแล้วผมจะนิยมเขียนแบบหลังมากกว่าครับ
สิ่งที่จำเป็นต้องรู้ก่อนเขียน Regular Expression
Pattern Modifiers นั่นคือ option ต่าง ๆ ที่ใช้ปรับรูปแบบการค้นหาจาก pattern ที่กำหนด เช่น ใน PCRE ถ้าเราระบุ i ไว้หลัง pattern จะเป็นการเปรียบเทียบแบบไม่สนใจตัวเล็กหรือตัวใหญ่ หรือการใส่ s ไว้หลัง pattern จะหมายถึงการกำหนดให้ wild card character (.) รวมเอาอักษรขึ้นบรรทัดใหม่ไว้ด้วย (ดู modifers อื่น ๆ เพิ่มได้ที่ http://php.net/manual/en/reference.pcre.pattern.modifiers.php)
Pattern Syntax นั่นคือวิธีการเขียน regex นั่นเอง ในส่วนนี้จะรวมถึง meta-character เช่น ^ เป็นการระบุถึงต้นประโยค หรือ $ เป็นการระบุถึงท้ายประโยค หรือ . ที่จะหมายถึงตัวอักษรอะไรก็ได้ยกเว้นขึ้นบรรทัดใหม่ นอกจาก meta-character แล้ว ยังมีชุดของ character ที่ขึ้นต้นด้วย backslash อีกด้วย เช่น \d คือตัวเลข \D คืออักขระที่ไม่ใช่ตัวเลข \w คืออักขระที่นำมาใช้เป็นส่วนหนึ่งของคำได้ \W คือ อักขระที่ไม่ได้เป็นส่วนหนึ่งของคำ เป็นต้น รวมไปถึงการค้นหาตัวอักษรซ้ำ ๆ การทำ Back references การค้นหาแบบ optional ฯลฯ
Back References
ใช้สำหรับอ้างถึง subpattern ใน pattern ที่ระบุ back references ใน PHP จะขึ้นต้นด้วย backslash แล้วตามด้วยตัวเลขที่มากกว่า 0 ในขณะที่ของ javascript จะขึ้นต้นด้วย $ แล้วตามด้วยตัวเลขที่มากกว่า 0 โดย back references จะอ้างถึง subpattern เรียงตามลำดับจากตัวที่พบตัวแรก ให้เป็น 1 ตัวที่สอง ให้เป็น 2 ไปเรื่อย ๆ เช่น เรามี pattern คือ (cat) and (dog) เมื่อเรา match ได้ เราจะได้ \1 เป็น cat และ \2 เป็น dog นั่นเอง
ตัวอย่าง Regular Expression
ดูใน LIVE DEMO ได้เลยครับ (Javascript Regular Expression DEMO)
อ้างอิง
เมพมากๆ คับพี่อู