ณัฐธิดา หมวดเพ็ชร [ 30 มิถุนายน 2558 ]
Regular Expression
Regular Expression คือ การกำหนดรูปแบบอักขระ เพื่อใช้ในการค้นหาค่าในรูปแบบของ String โดย Regular Expression มีพื้นฐานมาจากทฤษฎีทางคณิตศาสตร์ที่ใช้ในการเปรียบเทียบข้อความที่ต้องการค้นหากับรูปแบบที่กำหนดว่ามีความสอดคล้องกันหรือไม่
รูปแบบอักขระของ Regular Expression มาจากการผสมอักขระพื้นฐานหลายตัวเข้าด้วยกัน เช่น /abc/
หรือจากการผสมอักขระพื้นฐานกับอักขระพิเศษ เช่น /ab*c/
หรือ/Chapter (\d+)\.\d*/
ที่ใช้เครื่องหมายวงเล็บเป็นหน่วยความจำ โดยข้อความที่ตรงกับรูปแบบอักขระในวงเล็บนี้จะถูกจดจำไว้เพื่อเรียกใช้ในภายหลัง
มาดูสัญลักษณ์ของ Regular Expression ที่ใช้กันบ่อยๆดีกว่า
- ^ แทนความหมายว่า “ขึ้นต้นด้วย” เป็นจุดเริ่มของข้อความ
- $ แทนความหมายว่า “ลงท้ายด้วย” เป็นจุดสิ้นสุดของข้อความ
- . แทนตัวอักษรใด ๆ หนึ่งตัวยกเว้น NULL และแทนตัวขึ้นบรรทัดใหม่
- | ใช้เป็นตัวคั่นเพื่อแสดงตัวเลือก
- ? แทนการเกิดขึ้น 0 หรือ 1 ครั้ง
- + แทนการเกิดขึ้น1 ครั้งเป็นต้นไป
- * แทนการเกิดขึ้น 0 ครั้งขึ้นไป
- \ เป็นเครื่องหมาย Backslash ตรงตัวหรือทำให้ตัวอักษรซึ่งเป็น Operator เช่นเครื่องหมายคูณ, หาร, บวก และลบ กลายเป็นตัวอักษรธรรมดาตัวหนึ่ง เช่น \* จะหมายถึง ตัวดอกจันหนึ่งตัว ไม่ใช่เครื่องหมายคูณเป็นต้น
- ( ) เครื่องหมายกลุ่ม สัญญลักษณ์ทั้งหลายในวงเล็บนี้จะถือเป็นหนึ่งตัว
- [ ] ในเครื่องหมายนี้จะเป็นลิสต์ของตัวอักษร ซึ่งตัวใดตัวหนึ่งในลิสต์สามารถจับคู่ได้กับใน source_string ถ้าต้องการให้เป็นตรงกันข้ามคือต้องการ source_string ที่ไม่มีในลิสต์จะต้องใส่ ^ เข้าไป เช่น ^[a-zA-Z] ห้ามตัวอักษรไม่ว่าตัวเล็กหรือใหญ่
- [. .] แสดงตัวอักษรหนึ่งตัว ซึ่งอาจจะประกอบด้วยอักขระมากกว่าหนึ่งตัว
- i เป็นการจับคู่ตามรูปแบบ โดยไม่สนใจเรื่องตัวอักษรใหญ่หรือเล็ก (Case Insensitive)
- c เป็นการจับคู่ตามรูปแบบ โดยจะสนใจเรื่องตัวอักษรใหญ่หรือเล็ก (Case Insensitive)
การสร้าง Regular Expression มีอยู่ด้วยกัน 2 แบบ
1. การสร้างด้วยตัวข้อมูลแบบ regular expression
วิธีนี้จะสร้าง regular expression ในทันทีที่เสร็จสิ้นการโหลดสคริปต์ จะให้ประสิทธิภาพที่ดีกว่า ถ้าใช้กับ regular expression ที่ไม่มีการเปลี่ยนแปลงใดๆอีก
2. การเรียกใช้ฟังก์ชัน constructor ของอ็อบเจกต์ RegExp
วิธีนี้จะสร้าง regular expression ในขณะที่สคริปต์ทำงาน ควรใช้วิธีนี้เมื่อรู้ว่ารูปแบบอักขระของ regular expression อาจมีการเปลี่ยนแปลงได้ หรือใช้ในกรณีที่ไม่ได้กำหนดรูปแบบไว้ในตอนแรก แต่ได้มาในภายหลัง เช่น จากการป้อนข้อมูลของผู้ใช้
ปัญหาที่อาจจะพบได้เมื่อเลือกใช้วิธีที่ 1
เมื่อเราต้องการค้นหาคำที่เราต้องการ /#{name}/i แล้วเราเกิดพิมพ์ผิด เช่น ต้องการจะค้นหา “แมว” แต่พิมพ์ผิดเป็น “(แมว” วิธีนี้อาจทำให้เกิดข้อผิดพลาดขึ้นได้ เพราะโปรแกรมมองว่า “(” เป็นสัญลักษณ์ตัวหนึ่งของ regular expression ตัวหนึ่ง
แต่วิธีที่ 2 อาจแก้ปัญหาของวิธีที่ 1 ได้
โดยเราจะใช้ฟังก์ชัน constructor ของอ็อบเจกต์ RegExp ดังนี้
Regexp.new(Regexp.escape(name), Regexp::IGNORECASE)
( แก้ไขกรณีข้องต้น โดยการใช้ IGNORECASE ) เพียงเท่านี้ก็ทำให้ไม่เกิดข้อผิดพลาดในการค้นหาอีก
ศึกษาข้อมูลเพิ่มเติมได้ที่ : http://ruby-doc.org/core-2.2.0/Regexp.html