+https://en.wikipedia.org/wiki/Regular_expression
+https://regexr.com/
regex คือ การกำหนดรูปแบบหรือกลุ่มคำ เพื่อเอาไว้ใช้ค้นหาข้อความต่างๆตามที่เราต้องการ
- ค้นหาอักขระธรรมดา
- ค้นหาความข้อที่กำหนดไว้
- ค้นหาอักขระพิเศษ
รูปแบบหรือกลุ่มคำที่กำหนดไว้โดย regex อาจจะ match ได้แค่ 1 อัน หรือ ได้หลายๆอัน หรืออาจจะไม่ match เลยก็ได้ ขึ้นกับเงื่อนไขที่เราต้องการ กำหนดลงไป
Regular Expressions มีอยู่เกือบทุกภาษา Programming แต่อาจแตกต่างกันนิดหน่อย
regex สามารถใช้เพื่อค้นหา, แก้ไข และจัดการข้อความ
Ex. Ctrl + F ใช้หลักการ Regular Expressions
Regular Expressions ใช้เมื่อใด
- เมื่อมีข้อมูลเยอะๆ แต่ต้องการหาข้อมูลที่เฉพาะเจาะจง
- ค้นหาคำที่ซับซ้อน เช่น ขึ้นต้น A ลงท้ายด้วย x
- คำที่ขึ้นต้นด้วยอะไรก็ได้ แต่ตรงกลางข้อความต้องมีเครื่องหมาย และลงท้ายตามที่กำหนด เช่น email
- ตรวจสอบรูปแบบของข้อความ เช่น รหัส เลขบัตรประชาชน
เครื่องมือสำหรับการหัดเขียน regex คือ Sublime Text เพราะสะดวกมาก และแสดงผลการค้นหาได้ทันที
ใช้งานช่องค้นหา หรือ กด Ctrl + F
ใส่ข้อมูลที่ต้องการเอาไว้สำหรับค้นหา จากนั้นก็ลองหัดเขียน regex ได้เลย
ผลลัพธ์ที่ได้ก็จะแสดงผลแบบรวดเร็ว โดยที่จะมีกรอบสีขาวๆครอบข้อความหรือตัวอักษาที่ match ตามเงื่อนไข
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
[regex][regex]
ค้นหาอะไรก็ได้ที่อยู่ข้างใน [] แล้วตามด้วยอะไรก็ได้ที่อยู่ข้างใน [] อีกที เช่น [12][0] ได้ผลลัพธ์เฉพาะเลข 10 และ 20 เพราะเป็นการค้นหาเฉพาะเลข 1 หรือ 2 แล้วตามด้วย 0
[^regex]
ค้นหาอะไรก็ได้ที่ไม่ใช่ข้างใน [^regex] เช่น [^1205] จะได้ผลลัพธ์เฉพาะเลข 9 และ .(dot) เพราะว่าไม่ใช่สิ่งที่อยู่ข้างใน [^1205]
|
ใช้แทน หรือ เช่น 105|205 จะได้เฉพาะ 105, 205
Meta characters
\d
ค้นหาเฉพาะที่เป็นตัวเลข จะได้ เฉพาะที่เป็นตัวเลข เช่น ตัวเลขมาเป็น 1, 0, 5, 3 แยกกัน จะไม่ได้มาเป็นชุด 1053 เพราะว่า \d เป็นการค้นหาเฉพาะ 0–9 เท่านั้น
\d+
+ หมายถึงมี 1 หรือมากกว่า 1 หมายความว่า ตัวเลข 0–9 มี 1 หรือมากกว่า 1 ตัวก็ได้ ก็จะสามารถค้นหาตัวเลขที่เป็นชุดเช่น 1053, 205, 111
\D
ค้นหาอะไรก็ได้ที่ไม่ใช่ตัวเลข 0–9 จะได้ .(dot), whitespace(ช่องว่าง) และตัวอักษรภาษาอังกฤษ
\D+
ภาษาอังกฤษที่เป็นคำๆ เช่น Ant, Cat
\s
ค้นหาเฉพาะ whitespace(ช่องว่าง)
\S
ค้นหาอะไรก็ได้ที่ไม่ใช่ whitespace(ช่องว่าง) ก็จะได้ทุกตัวในข้อมูล(แต่ไม่เป็นชุด)
ถ้าอยากได้แบบเป็นชุด ก็เติม +
\w
ค้นหาตัวอักษรและตัวเลข ความหมายเดียวกับ [a-zA-Z_0-9]
\W
ค้นหาอะไรที่ไม่ใช่ตัวอักษรและตัวเลข ความหมายเดียวกับ [^a-zA-Z_0-9]
Quantifier
*
มีหรือไม่มีก็ได้
+
มี 1 หรือมากกว่า 1 ตัว
?
ไม่มีเลย หรือมีแค่ 1 ตัวเท่านั้น เช่น 10? จะได้ เลข 1 เพราะเป็นการค้นหาเลข 1 ที่จะมีหรือไม่มีเลข 0 ด้วยก็ได้
{x}
x แทนจำนวนของสิ่งที่ต้องการค้นหา เช่น \d{3} เป็นการค้นหาตัวเลขที่มีจำนวน 3 ตัว เช่น 342 ,423, 444
{x,y}
x แทนจำนวนอย่างน้อยที่ต้องการค้นหา
y แทนจำนวนสูงสุดที่ต้องการค้นหา
เช่น \d{2, 3} เป็นการค้นหาตัวเลขที่มีจำนวนอย่างน้อย 2 ตัว แต่ไม่เกิน 3 ตัว เช่น 105, 205, 144, 555
ตัวอย่างอื่นๆ
[^0–9] อะไรก็ได้ที่ไม่ใช่เลข 0–9
ภาษาไทยใช้ [ก-๙]
นำมาใช้ประโยชน์ เช่น
การเขียน htacess mod rewrite
การเขียน script จับไวรัส มัลแวร์ โดยกำหนด รูปแบบ ของ code ไวรัสนั่นเองภาษา PHP ใช้ฟังก์ชัน preg_match() ในการแมทช์ pattern
- อ่านเพิ่ม
+https://medium.com/@_trw/regular-expressions-คืออะไร-2fab4a91ea34
+https://devahoy.com/posts/regular-expressions-101/
+http://blog.stephack.com/2012/05/regular-expression-cheats.html
+http://www.vogella.com/tutorials/JavaRegularExpressions/article.html#common-matching-symbols
+https://www.tamemo.com/post/111/how-to-regular-expression/
+http://www.erp.mju.ac.th/acticleDetail.aspx?qid=37&
Mod Rewrite
- +http://www.thaiseoboard.com/index.php?topic=3675.0
+http://www.thaiseoboard.com/index.php/topic,207324.0.html - +https://www.regexpal.com/
+https://www.regextester.com/53716 - +https://txt2re.com/
- +https://www.regexmagic.com/
+https://txt2re.com/
—
/^((\(?\d{3,4}\)?)|(\d{3,4}-)?)\d{7,8}$/
/^((\(?\d{3,4}\)?)|(\d{3,4}-)?)\d{7,8}$/
ข้อความ (String) ต้องขึ้นต้นด้วย
/^((\(?\d{3,4}\)?)|(\d{3,4}–)?)\d{7,8}$/
ระหว่าง 1.อักขระ ในวงเล็บ หรือ 2.อักขระ ในวงเล็บ มีหรือไม่มีก็ได้
ไวยกรณ์ผิด Syntax Error จากตัวอักขระ – ควรจะเป็น \- หรือ ต้องไม่มี
/^((\(?\d{3,4}\)?)|(\d{3,4}-)?)\d{7,8}$/
1. วงเล็บเปิด 1 อักขระ มีหรือไม่มีก็ได้
/^((\(?\d{3,4}\)?)|(\d{3,4}-)?)\d{7,8}$/
และตามด้วยตัวเลขใดๆ 3-4 อักขระ
/^((\(?\d{3,4}\)?)|(\d{3,4}-)?)\d{7,8}$/
ตามด้วยวงเล็บปิด 1 อักขระ มีหรือไม่มีก็ได้
หรือ
2. ตัวเลขใดๆ 3-4 อักขระ มีหรือไม่มีก็ได้ /^((\(?\d{3,4}\)?)|(\d{3,4}–)?)\d{7,8}$/
ไวยกรณ์ผิด Syntax Error จากตัวอักขระ – ควรจะเป็น \- หรือ ต้องไม่มี
และ ตัวเลขใดๆ 7-8 อักขระ ท้ายสุดของข้อความ /^((\(?\d{3,4}\)?)|(\d{3,4}-)?)\d{7,8}$/
/^(\+)?(86)?0?1\d{10}$/
ขึ้นต้นข้อความ /^(\+)?(86)?0?1\d{10}$/
ด้วย เครื่องหมาย + 1 ตัว มีหรือไม่มีก็ไ้ด้ ^(\+)?(86)?0?1\d{10}$
ตามด้วย เลข 86 มีหรือไม่มีก็ไ้ด้ /^(\+)?(86)?0?1\d{10}$/
ตามด้วย เลข 0 มีหรือไม่มีก็ได้ /^(\+)?(86)?0?1\d{10}$/
ตามด้วย เลข 1 (ต้องมี 1 ตัว) /^(\+)?(86)?0?1\d{10}$/
และ ตัวเลขใดๆ 10 ตัว ท้ายสุดของข้อความ /^(\+)?(86)?0?1\d{10}$/
Waiting for Recheck
^ เป็นตัวบอกว่าเริ่มต้น เช่น ^5 หมายความต้องขึ้นต้นด้วยเลข 5
$ เป็นตัวบอกว่าสิ้นสุด เช่น 5$ หมายความว่าต้องลงท้ายด้วยเลข 5
? บอกว่า ตัวอักษรที่อยู่ข้างหน้า 1 ตัว จะมีหรือไม่มีก็ได้ เช่น X5? ประโยคที่เข้ากับเงื่อนไข อาจจะเป็น X5 หรือX ก็ได้
\d จะแทนตัวเลข 0-9 จำนวน 1 ตัว
\d{3} บอกว่าจะต้องมีตัวเลข 3 ตัว
\d{1,4} บอกว่าสามารถเป็นตัวเลขตั้งแต่ 1 ถึง 4 ตัว
+ จะแทนความหมายว่า ตั้งแต่หนึ่งตัวขึ้นไป เช่น 5+ หมายถึงประโยคนี้ต้องมีเลข 5 อย่างน้อย 1 ตัวคือ 5, 55,555 ก็ถูกหมด
\+ เมื่อมี \ มาอยู่ข้างหน้า หมายความว่า + จะเป็นเครื่องหมาย+ ธรรมดา ไม่ได้ทำงานอะไร
() จะเป็นการรวมตัวอักษร เช่น (789) หมายความ จะต้องมีตัวเลข 789 อยู่ด้วย , (789)? หมายความว่า จะมีตัวเลข 789 อยู่ด้วยหรือไม่ก็ได้ แต่ถ้ามี ก็ต้องมีครบทั้ง 3 ตัวจะมีแค่ 78 ก็ไม่ถูก
| จะแทนความหมายว่า หรือ เช่น (7|8|9) หมายความว่า จะเป็นเลข 7 หรือเลข 8 หรือเลข 9 ก็ได้ เช่น 70, 845, 9756 ก็ถูกต้องทั้งนั้น
—–
/^((\(?\d{3,4}\)?)|(\d{3,4}-)?)\d{7,8}$/
1. แบ่งออกเป็น 2 ส่วนก่อน /^((\(?\d{3,4}\)?)|(\d{3,4}-)?) และ \d{7,8}$/
2. \d{7,8}$ หมายความตัวเลขด้านหลัง จะมีจำนวน 7 ถึง 8 ตัว
3. /^((\(?\d{3,4}\)?)|(\d{3,4}-)?) มีข้อมูลอยู่ในวงเล็บ 2 ชุด คือ (\(?\d{3,4}\)?) และ (\d{3,4}-) เชื่อมกันด้วย | ซึ่งแสดงว่า จะเป็นชุดใดก็ได้
4. (\(?\d{3,4}\)?) จะประกอบด้วย \(? หมายความว่า จะมี ( หรือไม่ก็ได้, \d{3,4} หมายความว่าจะต้องเป็นตัวเลข 3-4 ตัว , \)? หมายความว่า จะมี ) หรือไม่ก็ได้
5. (\d{3,4}-) ประกอบด้วย \d{3,4} หมายความว่า ต้องเป็นตัวเลข 3 ถึง 4 ตัว, – จะต้องมีตเครื่องหมาย – ตามหลังตัวเลข 3 ถึง 4 ตัวข้างหน้าด้วย
สรุปตัวเลขที่ถูก pattern ได้ดังนี้
1231234567
12312345678
12341234567
123412345678
(1231234567
123)1234567
(123)1234567
(123412345678
1234)12345678
(1234)12345678
123-1234567
123-12345678
1234-1234567
1234-12345678
บางอันจะเห็นว่ามี ( หรือ ) แค่อย่างละอัน ไม่ได้เขียนผิดนะครับ pattern มันบอกแบบนั้น ผมลองแล้วก็ผ่านด้วย