Regular Expressions สำคัญขนาดไหนแล้วคืออะไร

og:image

สำหรับนักพัฒนาโปรแกรมอาจจะเคยได้ยินคำว่า ReGex หรือเคยผ่านต่ามันมาบ้างละซึ่งเราจะเห็นทุกอย่างที่เกี่ยวกับการ validate data หรือ ตรวจสอบข้อมูล หรือข้อความให้มีความตรงความต้องการที่เราได้กำหนดเงื่อนไขไว้ให้มันทำงานได้ถูกต้องตามเงื่อนไขวันนี้จะมารู้ว่าทำเขียนอย่างไร หรือ ว่า มันคืออะไร และทำงานอย่างไร

Regular Expression คือ การกำหนดรูปแบบตัวอักษร เพื่อใช้ในการค้นหาค่าในรูปแบบของ String โดย Regular Expression มีพื้นฐานมาจากทฤษฎีทางคณิตศาสตร์ที่ใช้ในการเปรียบเทียบข้อความที่ต้องการค้นหากับรูปแบบที่กำหนดว่ามีความสอดคล้องกันหรือไม่

RegEx Cheatsheet

สัญลักษณ์ความหมาย
.ทุกตัวอักษรยกเว้นการขึ้นบรรทัดใหม่
\wทุกๆ ตัวอักษรและ underscore
\Wที่ไม่ใช่ตัวอักษร
\dตัวเลขทุกตัว
\Dที่ไม่ใช่ตัวเลข
\swhitespace(tab, space, line break)
\Sที่ไม่ใช่ whitespace
[abc]a, b หรือ c อย่างใดอย่างหนึ่ง
[^abc]อะไรก็ได้ที่ไม่ใช่ a,b หรือ c
[a-f]อะไรก็ได้ระหว่าง a ถึง f
^เริ่มต้น line
$สิ้นสุด line
\Aเริ่มต้นคำ
\zสิ้นสุดคำ
(…)capture group
\1reference group #1
(a | b)a หรือ b
a*ไม่มี a หรือมีก็ได้
a+a อย่างน้อย 1 ตัว
a?ไม่มี a หรือมี a ได้แค่ 1ตัว
a5มี a 5 ตัว
a5มี a ได้ 2 ถึง 5 ตัว
ข้อมูลประกอบ

ตัวอย่างการนำ Regular Expressions ไปใช้

Validations ฟอร์มต่างๆ เช่น การเช็คว่า ช่องนี้เป็นช่อง email, หมายเลขโทรศัพท์, password หรือโดเมนเนม เป็นต้น

Tools & Editors

ในการใช้งาน Regular Expressions สามารถใช้ได้แทบทุกภาษารวมถึงเกือบทุก Editor น่าจะมีมาให้หมด ส่วนวิธีการการใช้งาน ก็อาจจะแตกต่างกันเล็กน้อย แต่ concept ยังคงเหมือนกัน ตัวอย่าง Tool Online รวมถึง Editors ต่างๆ คร่าวๆ เช่น

Basics

พื้นฐานแรกสุดเลยคือเรื่องของ Character classes คือเราสามารถค้นหาคำนั้นๆใน regex ได้เลย เช่น

สมมติเรามีตัวอย่างข้อมูลดังนี้

John
Johny
Joey
Jane
Jack
Jim
James

หากเราต้องการหาชื่อที่มีคำว่า “John” ก็สามารถใช้ regex ได้แบบนี้เลย

John
ผลลัพธ์
  • . (dot) : เอาไว้ค้นหาตัวอักษรอะไรก็ได้ เช่น regex T.m จะ match Tim, Tom, Tam
  • ^ : สัญลักษณ์เริ่มต้นของ String เช่น ^N... N ขึ้นต้นประโยค จะ match Name แต่ไม่ match FirstName
  • $ : สัญลักษณ์สิ้นสุดของ String เช่น d$ มี d ลงท้ายประโยค จะ match Thailand, Poland, England แต่ละไม่ match Spain

ตัวอย่าง

Regexคำอธิบาย
Johnค้นหาแบบคำตรงๆตัวเลย จะ match แค่ John
J...ค้นหาขึ้นตนด้วย J และอีก 3 ตัวเป็นอะไรก็ได้ จะ match กับ John, Joey, Jane, Jack
John|Joey(|) หมายถึงหรือ คือหาคำที่มี John หรือ Joey จะmatch John, Johny, Joey
^Jจะมีความหมายคือ เริ่มต้นคำด้วยตัวอักษร J ก็จะ matches ทุกคำ
y$หมายถึงลงท้ายด้วย ตัวอักษร y ก็จะ match คำว่า Johnny กับ Joey
ตัวอย่าง การใช้งาน

JavaScript

flag ต่างๆ ที่สำคัญ เช่น

  • /i : case sensitive เราสามารถกำหนดว่าจะหาข้อมูลแบบ case sensitive หรือไม่
  • /g : global เพื่อให้ match ทั้งหมด ไม่เฉพาะตัวแรกเท่านั้น

การสร้าง regex ใน JavaScript ทำได้ 2 แบบคือ

1. regex literal

สร้างโดยใช้เครื่องหมาย // หรือ //g (global)

let re = /[abc]/;

2. RegExp Object

let re = new RegExp('[abc]');

RegExp.test()

การทดสอบว่า regex ของเรา match กับ string ที่ต้องการหรือไม่ สามารถทำได้ผ่าน regexp.test() ดังเช่น

let re = /[abc]/;

re.test('a') // true

String.match() & String.replace()

การใช้ String.match() เพื่อหา string กับ regex ค่าที่ได้จะส่งกลับมาเป็น array ของข้อมูลที่ match เจอ ตัวอย่าง เช่น

let re = /[abc]/g;

'ant cat dog'.match(re);
// ["a", "c", "a"]

หรือการใช้ String.replace() จากตัวอย่างเรื่อง group ด้านบน

let data = `
2016-02-11
2016-02-12
2016-03-15
2016-03-30
`;
let re = /(\d{4})-(\d{2})-(\d{2})/g;

let newData = data.replace(re, '$3/$2/$1');

console.log(newData);

// "11/02/2016
// 12/02/2016
// 15/03/2016
// 30/03/2016"

อ้างอิง https://devahoy.com/blog/2016/11/regular-expressions-101#2–tools–editors