Regular Expressions คืออะไร ?
หลายคนอาจจะเคยได้ยินเกี่ยวกับ Regular Expressions มาแล้วบ้าง แต่อาจจะยังไม่เข้าใจว่าจริงๆแล้วมันคืออะไรกันแน่ หรืออาจจะเคยใช้แหละ
แต่ไม่รู้ว่ามันคือ Regular Expressions หรือไม่รู้จะนำมาใช้ในการเขียนโปรแกรมยังไง ซึ่งผมก็เป็นหนึ่งในนั้น ฮ่าๆ
Regular Expressions คืออะไร ?
Regular Expressions หรือเรียกย่อๆว่า “ regex ” นั่นเอง
regex คือ การกำหนดรูปแบบหรือกลุ่มคำ เพื่อเอาไว้ใช้ค้นหาข้อความต่างๆตามที่เราต้องการ สามารถค้นหาได้ทั้งอักขระธรรมดา หรือค้นหาความข้อที่กำหนดไว้ หรือจะเป็นอักขระพิเศษก็สามารถค้นหาได้
รูปแบบหรือกลุ่มคำที่กำหนดไว้โดย regex อาจจะ match ได้แค่ 1 อัน
หรือ match ได้หลายๆอัน หรืออาจจะไม่ match เลยก็ได้
Regular Expressions มีอยู่เกือบทุกภาษา Programming แต่อาจจะแตกต่างกันออกไปเพียงนิดหน่อย
regex สามารถใช้เพื่อค้นหา, แก้ไข และจัดการข้อความได้
ถ้าใครยังนึกภาพไม่ออก ให้นึกถึงการใช้ Ctrl + F ที่เราใช้ในชีวิตประจำวันกันครับ เพราะนั่นคือการใช้หลักการ Regular Expressions อย่างหนึ่ง
Regular Expressions ใช้ตอนไหน ?
- เวลาที่มีข้อมูลเยอะๆ แต่เราต้องการหาข้อมูลที่เฉพาะเจาะจง
- ค้นหาคำที่มีความซับซ้อน เช่น ขึ้นต้น A ลงท้ายด้วย T หรือ หาเฉพาะตัวเลข เป็นต้น
- คำที่ขึ้นต้นด้วยอะไรก็ได้ แต่ตรงกลางข้อความต้องมีเครื่องหมาย และลงท้ายตามที่กำหนด เช่น email เป็นต้น
- ตรวจสอบรูปแบบของข้อความ เช่น รหัสนักศึกษา เลขบัตรประชาชน เป็นต้น
Note !
เครื่องมือที่ผมแนะนำสำหรับการหัดเขียน regex ก็คือ Sublime Text นั่นเอง
เพราะสะดวกมากๆ และสามารถแสดงผลการค้นหาได้ทันทีเลยยย

เมื่อเปิด Sublime Text ขึ้นมาแล้วต้องการจะเรียกใช้งานช่องค้นหา
เอาไว้เผื่อหัดเขียน regex เล่นๆ ก็สามารถทำได้โดยกด Ctrl + F ได้เลยครับ

ใส่ข้อมูลที่ต้องการเอาไว้สำหรับค้นหา จากนั้นก็ลองหัดเขียน regex ได้เลย
ผลลัพธ์ที่ได้ก็จะแสดงผลแบบรวดเร็วทันใจเลยครับ โดยที่จะมีกรอบสีขาวๆครอบข้อความหรือตัวอักษาที่ match ตามเงื่อนไขอยู่นั่นเองครับ
(แต่ถ้าของใครไม่แสดงผล อาจจะหมายความว่าคุณเขียนผิดนั่นเอง ฮ่าๆ)
ตัวอย่างที่ 1 Common matching symbols

- . (dot) : เอาไว้ค้นหาแทนตัวอะไรก็ได้ เช่น 1.1 จะได้ผลลัพธ์เป็น 111, 191
เพราะเป็นชุดจำนวนเลขที่ขึ้นต้นด้วย เลข 1 และลงท้ายด้วยเลข 1 - ^regex : ค้นหาคำขึ้นต้นของข้อความ เช่น ^2.. จะได้ผลลัพธ์เฉพาะ 2.5, 205 เพราะขึ้นต้นด้วยเลข 2 และตามหลังด้วยอะไรก็ได้ 2 ตัว
- regex$ : ค้นหาคำลงท้ายของข้อความ เช่น 1$ จะได้ผลลัพธ์เฉพาะ 111, 191 เพราะลงท้ายด้วยเลข 1 นั่นเอง
- [regex] : ค้นหาอะไรก็ได้ที่อยู่ข้างใน [] เช่น [29] จะได้ผลลัพธ์เฉพาะเลข 2 และ 9 ในบรรทัดที่ 3, 4, 6 เพราะว่าเป็นการค้นหาเฉพาะเลข 2 หรือ 9 นั่นเองครับ
- [regex][regex] : ค้นหาอะไรก็ได้ที่อยู่ข้างใน [] แล้วตามด้วยอะไรก็ได้ที่อยู่ข้างใน [] อีกที เช่น [12][0] จะได้ผลลัพธ์เฉพาะเลข 10 และ 20 ในบรรทัดที่ 2 กับ 4 เพราะเป็นการค้นหาเฉพาะเลข 1 หรือ 2 แล้วตามด้วย 0
- [^regex] : ค้นหาอะไรก็ได้ที่ไม่ใช่ข้างใน [^regex] เช่น [^1205] จะได้ผลลัพธ์เฉพาะเลข 9 และ .(dot) เพราะว่าไม่ใช่สิ่งที่อยู่ข้างใน [^1205]
- | : เป็นสัญลักษณ์ใช้แทน หรือ นั่นเองครับ เช่น 105|205 จะได้เฉพาะ 105, 205
ตัวอย่างที่ 2 Meta characters

- \d : ค้นหาเฉพาะที่เป็นตัวเลข จะได้ เฉพาะที่เป็นตัวเลข เช่น ในบรรทัดที่ 2 จะได้ตัวเลขมาเป็น 1, 0, 5 แยกกันมาเลย จะไม่ได้มาเป็นชุด 105 นะครับ ทำไมน่ะหรอ ? เพราะว่า \d เป็นการค้นหาเฉพาะ 0–9 เท่านั้น แล้วถ้าเราอยากจะหาตัวเลขที่มาเป็นชุดเลยล่ะ เช่น 105, 205, 111, 191 เราจะทำยังไง
- Tip ! : เราสามารถใช้วิธีค้นหาได้โดยใช้เป็น \d+ ซึ่งเติม + ต่อหลังไป ความหมายของ + ก็คือ หมายถึงมี 1 หรือมากกว่า 1 นั่นเองครับ เท่านี้ก็จะหมายความว่า ตัวเลข 0–9 มี 1 หรือมากกว่า 1 ตัวก็ได้ เท่านี้เราก็จะสามารถค้นหาตัวเลขที่เป็นชุดเช่น 105, 205, 111, 191 ได้แบบสบายๆกันเลยล่ะครับทุกคน
- \D : ค้นหาอะไรก็ได้ที่ไม่ใช่ตัวเลข 0–9 ก็จะได้ .(dot), whitespace(ช่องว่าง) และตัวอักษรภาษาอังกฤษครับ
- Tip ! : เหมือนเดิม ถ้าเติม + ต่อท้ายไป \D+ ก็จะได้ภาษาอังกฤษที่เป็นคำๆ เช่น Ant, Cat, Bat เป็นต้น
- \s : ค้นหาเฉพาะ whitespace(ช่องว่าง)
- \S : ค้นหาอะไรก็ได้ที่ไม่ใช่ whitespace(ช่องว่าง) ก็จะได้ทุกตัวในข้อมูล (แต่ไม่เป็นชุดนะครับ) ถ้าอยากได้แบบเป็นชุด ก็เติม + ไปเท่านั้นเอง ^^
- \w : ค้นหาตัวอักษรและตัวเลข ความหมายเดียวกับ [a-zA-Z_0-9]
- \W : ค้นหาอะไรที่ไม่ใช่ตัวอักษรและตัวเลข ความหมายเดียวกับ [^a-zA-Z_0-9]
ตัวอย่างที่ 3 Quantifier

- * : หมายถึง มีหรือไม่มีก็ได้ เช่น at* จะได้เฉพาะ A ในบรรทัดที่ 7 และ at ในบรรทัดที่ 8, 9
- + : หมายถึง มี 1 หรือมากกว่า 1 ตัว (ตัวอย่างอธิบายไปในหัวข้อก่อนแล้ว ^^)
- ? : หมายถึง ไม่มีเลย หรือมีแค่ 1 ตัวเท่านั้น ! เช่น 20? จะได้ เลข 2 ในบรรทัดที่ 3 และ เลข 20 ในบรรทัดที่ 4 เพราะว่าเป็นค้นหาเลข 2 ที่จะมีหรือไม่มีเลข 0 ด้วยก็ได้
- {x} : หมายถึง x จะแทนจำนวนของสิ่งที่ต้องการค้นหา เช่น \d{3} จะได้เฉพาะ 105, 205, 111, 191 เพราะเป็นการค้นหาตัวเลขที่มีจำนวน 3 ตัวนั่นเอง
- {x,y} : หมายถึง x จะแทนจำนวนอย่างน้อยที่ต้องการค้นหา ส่วน y แทนจำนวนสูงสุดที่ต้องการค้นหา เช่น \d{2, 3} จะได้เฉพาะ 105, 205, 111, 191 เพราะเป็นการค้นหาตัวเลขที่มีจำนวนอย่างน้อย 2 ตัว แต่ไม่เกิน 3 ตัว เพราะฉะนั้นจะหา 1.5 และ 2.5 ไม่เจอ เพราะไม่ตรงตามเงื่อนไขดังกล่าว
ตัวอย่าง (เล็กๆน้อย) เกี่ยวกับการนำ regex มาใช้
ถ้าเราต้องการจะใส่เครื่องหมาย “ , “ ให้กับ 1500 และ 1000 เราจะทำยังไงดีน้าา ?

เราก็จะใช้ regex เข้ามาช่วยนั่นเอง
โดยการสร้าง ArrayList<String> ชื่อว่า number มาเก็บค่าที่ได้จากการนำ
text มา split ด้วยเงื่อนไข [^0–9] เรียกง่ายๆคือ อะไรก็ได้ที่ไม่ใช่เลข 0–9
จากนั้น ArrayList<String> number เราก็จะมีค่าเป็น [“1500”, “1000”]
เท่านี้เราก็จะรู้แล้วว่า ค่าที่ผู้ใช้กรอกเข้ามานั้นมีค่าอะไรบ้าง แล้วก็สามารถนำค่าที่ได้ไปเพิ่ม “ , ” ให้กับมันได้หรือจะประยุกต์ไปใช้ต่อในส่วนอื่นๆได้ตามสบายเลย ^^
แถม อีกตัวอย่างละกัน ฮ่าๆ

ถ้าเราต้องการเช็คว่า เบอร์โทรที่ผู้ใช้กรอกเข้ามาถูกต้องตามรูปแบบถูกต้องหรือเปล่า
เราจะเช็คยังไงดี ? เราก็คงต้องมานั่ง for loop , if else เช็ค 4 ตัวแรกเป็นเลขไหมน๊าา
ตำแหน่งที่ 5 เป็นเครื่องหมาย “ - ” หรือเปล่าน๊าา บลาๆๆๆ แค่คิดก็ปวดหัวแล้ววว
วันนี้เราจะพามาใช้ regex ที่ได้อ่านกันไปข้างต้นนี่แหละครับ เราไปดูกันเลยยย

ในภาษา Java เราสามารถใช้คลาสที่ชื่อว่า Pattern และ Matcher เข้ามาช่วยได้
ในตัวอย่างเรากำหนดรูปแบบ(pattern)ของ regex ไว้ จากนั้นเราก็นำ pattern
มาใช้กับ matcher แล้วใส่ข้อมูล(text) ที่เราต้องการเช็คเข้าไป
เท่านี้เราก็จะสามารถใช้ตัวแปร matcher มาเช็คได้แล้วว่า เบอร์โทรที่ผู้ใช้กรอกเข้ามานั้นถูกต้องตามรูปแบบที่เราต้องการหรือเปล่า
เป็นยังไงบ้างครับ พอเริ่มรู้จัก regex กันแล้ว นำมาประยุกต์กับการเขียนโปรแกรมของเรา ชีวิตเราก็ดูจะง่ายขึ้นมาอีกหน่อยเลยใช่ไหมล่ะครับ ฮ่าๆ
เสริมอีกนิดหน่อย ในภาษา Java เราจะสร้าง regex บางตัว
โดยใช้เครื่องหมาย \\ เช่น \\d+ เป็นต้น
สรุป
ทั้งหมดที่ผมได้เขียนขึ้นมานี้ จากที่ได้ศึกษาจากบล็อคของคนอื่นๆที่เขียนเอาไว้แล้ว ผมได้นำมาเขียนขึ้นใหม่ตามความเข้าใจของผมเอง ถ้าใครอ่านแล้วไม่เข้าใจสามารถเข้าไปอ่านตามบล็อคอ้างอิงที่ผมแปะไว้ก็ได้นะครับ :=)
อ้างอิง
