Regular Expressions คืออะไร ?

_TRW
_TRW
Jul 25, 2017 · 4 min read

หลายคนอาจจะเคยได้ยินเกี่ยวกับ 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 นั่นเอง
เพราะสะดวกมากๆ และสามารถแสดงผลการค้นหาได้ทันทีเลยยย

มีช่องไว้สำหรับค้นหา หรือหัดเขียน regex

เมื่อเปิด 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 เราจะทำยังไงดีน้าา ?

สมมุติว่าตัวแปร text คือค่าที่ผู้ใช้กรอกเข้ามา

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

แถม อีกตัวอย่างละกัน ฮ่าๆ

สมมุติว่าตัวแปร text คือค่าที่ผู้ใช้กรอกเข้ามา

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

สมมุติว่าตัวแปร text คือค่าที่ผู้ใช้กรอกเข้ามา

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

เป็นยังไงบ้างครับ พอเริ่มรู้จัก regex กันแล้ว นำมาประยุกต์กับการเขียนโปรแกรมของเรา ชีวิตเราก็ดูจะง่ายขึ้นมาอีกหน่อยเลยใช่ไหมล่ะครับ ฮ่าๆ

เสริมอีกนิดหน่อย ในภาษา Java เราจะสร้าง regex บางตัว
โดยใช้เครื่องหมาย \\ เช่น \\d+ เป็นต้น


สรุป
ทั้งหมดที่ผมได้เขียนขึ้นมานี้ จากที่ได้ศึกษาจากบล็อคของคนอื่นๆที่เขียนเอาไว้แล้ว ผมได้นำมาเขียนขึ้นใหม่ตามความเข้าใจของผมเอง ถ้าใครอ่านแล้วไม่เข้าใจสามารถเข้าไปอ่านตามบล็อคอ้างอิงที่ผมแปะไว้ก็ได้นะครับ :=)


Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade