regex หรือ regular expression คือ การกำหนดรูปแบบหรือกลุ่มคำ เพื่อเอาไว้ใช้ค้นหาข้อความต่างๆตามที่เราต้องการ สามารถค้นหาได้ทั้งอักขระธรรมดา หรือค้นหาความข้อที่กำหนดไว้ หรือจะเป็นอักขระพิเศษก็สามารถค้นหาได้ รูปแบบหรือกลุ่มคำที่กำหนดไว้โดย regex อาจจะ match ได้แค่ 1 อัน
หรือ match ได้หลายๆอัน หรืออาจจะไม่ match เลยก็ได้
Regular Expressions มีอยู่เกือบทุกภาษา Programming แต่อาจจะแตกต่างกันออกไปเพียงนิดหน่อย
regex สามารถใช้เพื่อค้นหา, แก้ไข และจัดการข้อความได้
ถ้าใครยังนึกภาพไม่ออก ให้นึกถึงการใช้ Ctrl + F ที่เราใช้ในชีวิตประจำวันกันครับ เพราะนั่นคือการใช้หลักการ Regular Expressions อย่างหนึ่ง
Regular Expressions ใช้ตอนไหน ?
- เวลาที่มีข้อมูลเยอะๆ แต่เราต้องการหาข้อมูลที่เฉพาะเจาะจง
- ค้นหาคำที่มีความซับซ้อน เช่น ขึ้นต้น A ลงท้ายด้วย T หรือ หาเฉพาะตัวเลข เป็นต้น
- คำที่ขึ้นต้นด้วยอะไรก็ได้ แต่ตรงกลางข้อความต้องมีเครื่องหมาย และลงท้ายตามที่กำหนด เช่น email เป็นต้น
- ตรวจสอบรูปแบบของข้อความ เช่น รหัสนักศึกษา เลขบัตรประชาชน เป็นต้น
หัดเขียน Regular Expression : Regex Playground
Regex ที่ใช้งานบ่อยๆ : Commonly used Regex
Digits
- Whole Numbers –
/^\\d+$/
- Decimal Numbers –
/^\\d*\\.\\d+$/
- Whole + Decimal Numbers –
/^\\d*(\\.\\d+)?$/
- Negative, Positive Whole + Decimal Numbers –
/^-?\\d*(\\.\\d+)?$/
- Whole + Decimal + Fractions –
/[-]?[0-9]+[,.]?[0-9]*([\\/][0-9]+[,.]?[0-9]*)*/
Alphanumeric Characters
- Alphanumeric without space –
/^[a-zA-Z0-9]*$/
- Alphanumeric with space –
/^[a-zA-Z0-9 ]*$/
- Common email Ids –
/^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6})*$/
- Uncommon email ids –
/^([a-z0-9_\\.\\+-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$/
Password Strength
- Complex: Should have 1 lowercase letter, 1 uppercase letter, 1 number, 1 special character and be at least 8 characters long
/(?=(.*[0-9]))(?=.*[\\!@#$%^&*()\\\\[\\]{}\\-_+=~`|:;"'<>,./?])(?=.*[a-z])(?=(.*[A-Z]))(?=(.*)).{8,}/
- Moderate: Should have 1 lowercase letter, 1 uppercase letter, 1 number, and be at least 8 characters long
/(?=(.*[0-9]))((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.{8,}$/
Username
- Alphanumeric string that may include _ and – having a length of 3 to 16 characters –
/^[a-z0-9_-]{3,16}$/
URL
- Include http(s) Protocol
/https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#()?&//=]*)/
- Protocol Optional
/(https?:\\/\\/)?(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)/
Dates
- Date Format YYYY-MM-dd using separator “
- Date Format dd-MM-YYYY using separators “ or
.
or/
- Date Format dd-mmm-YYYY using separators “ or
.
or/
/* Date Format YYYY-MM-dd */
/([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))/
/* Date Format dd-MM-YYYY or
dd.MM.YYYY or
dd/MM/YYYY
with check for leap year */
/^(?:(?:31(\\/|-|\\.)(?:0?[13578]|1[02]))\\1|(?:(?:29|30)(\\/|-|\\.)(?:0?[1,3-9]|1[0-2])\\2))(?:(?:1[6-9]|[2-9]\\d)?\\d{2})$|^(?:29(\\/|-|\\.)0?2\\3(?:(?:(?:1[6-9]|[2-9]\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\\d|2[0-8])(\\/|-|\\.)(?:(?:0?[1-9])|(?:1[0-2]))\\4(?:(?:1[6-9]|[2-9]\\d)?\\d{2})$/
/* Date Format dd-mmm-YYYY or
dd/mmm/YYYY or
dd.mmm.YYYY */
/^(?:(?:31(\\/|-|\\.)(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec)))\\1|(?:(?:29|30)(\\/|-|\\.)(?:0?[1,3-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\\2))(?:(?:1[6-9]|[2-9]\\d)?\\d{2})$|^(?:29(\\/|-|\\.)(?:0?2|(?:Feb))\\3(?:(?:(?:1[6-9]|[2-9]\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\\d|2[0-8])(\\/|-|\\.)(?:(?:0?[1-9]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))\\4(?:(?:1[6-9]|[2-9]\\d)?\\d{2})$/
Code language: JavaScript (javascript)
Time
- Time Format HH:MM 12-hour, optional leading 0
/^(0?[1-9]|1[0-2]):[0-5][0-9]$/
- Time Format HH:MM 12-hour, optional leading 0, Meridiems (AM/PM)
/((1[0-2]|0?[1-9]):([0-5][0-9]) ?([AaPp][Mm]))/
- Time Format HH:MM 24-hour with leading 0
/^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/
- Time Format HH:MM 24-hour, optional leading 0
/^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/
- Time Format HH:MM:SS 24-hour
/(?:[01]\\d|2[0123]):(?:[012345]\\d):(?:[012345]\\d)/
Phone Numbers
- International Phone Numbers – with optional country code/extension
/* International Phone Numbers */
/^(?:(?:\\(?(?:00|\\+)([1-4]\\d\\d|[1-9]\\d?)\\)?)?[\\-\\.\\ \\\\\\/]?)?((?:\\(?\\d{1,}\\)?[\\-\\.\\ \\\\\\/]?){0,})(?:[\\-\\.\\ \\\\\\/]?(?:#|ext\\.?|extension|x)[\\-\\.\\ \\\\\\/]?(\\d+))?$/
Code language: PHP (php)
Note: Use regex for validating phone numbers only if you don’t have the choice to use a library. There are several libraries that handle phone numbers more accurately and should be used instead.
Identity Documents
- Social Security Number – Ref
/* can use either hypen(-) or space( ) character as separator */
/^((?!219-09-9999|078-05-1120)(?!666|000|9\\d{2})\\d{3}-(?!00)\\d{2}-(?!0{4})\\d{4})|((?!219 09 9999|078 05 1120)(?!666|000|9\\d{2})\\d{3} (?!00)\\d{2} (?!0{4})\\d{4})|((?!219099999|078051120)(?!666|000|9\\d{2})\\d{3}(?!00)\\d{2}(?!0{4})\\d{4})$/
Code language: JavaScript (javascript)
- Passport –
/^[A-PR-WY][1-9]\\d\\s?\\d{4}[1-9]$/
Payment Validation
regex for validating leading Credit cards like Visa, Mastercard and so on.
^(?:4[0-9]{12}(?:[0-9]{3})? # Visa
| (?:5[1-5][0-9]{2} # MasterCard
| 222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}
| 3[47][0-9]{13} # American Express
| 3(?:0[0-5]|[68][0-9])[0-9]{11} # Diners Club
| 6(?:011|5[0-9]{2})[0-9]{12} # Discover
| (?:2131|1800|35\d{3})\d{11} # JCB
)$
Code language: PHP (php)