Regular Expressions = regex
การกำหนดรูปแบบ,กลุ่มคำ เพื่อใช้ค้นหาข้อความ ตามต้องการ ค้นอักขระ,ความข้อ,ตรวจสอบรูปแบบ ฯลฯ
Ctrl + F ใช้หลักการ Regular Expressions
. = อะไรก็ได้ เช่น 1.1 = เลขขึ้นต้นด้วย 1 และลงท้ายด้วย 1
^regex =คำขึ้นต้นของข้อความ เช่น ^2.. จะได้ผลลัพธ์เฉพาะ 2.5, 203 =ขึ้นต้นด้วย= 2 ตามหลังด้วยอะไรก็ได้ 2 ตัว
regex$=คำลงท้ายของข้อความ เช่น 1$ ได้ 1611, 1921
[regex]=อะไรก็ได้ที่อยู่ข้างใน [] เช่น [59]
[regex][regex]=อะไรก็ได้ที่อยู่ข้างใน [] แล้วตามด้วยอะไรก็ได้ที่อยู่ข้างใน [] อีกที เช่น [21][0]
[^regex] =อะไรก็ได้ ที่ไม่ใช่ข้างใน [^regex] เช่น [^1205]
|=หรือ เช่น 505|2455 จะได้เฉพาะ 505, 2455
\d=หาเฉพาะที่เป็นตัวเลข และ เป็นการค้นหาเฉพาะ 0–9 เท่านั้น
\D=อะไรก็ได้ ที่ไม่ใช่ตัวเลข 0–9 จะได้ .(dot), whitespace(ช่องว่าง) และอักษรอังกฤษ
\s=หาเฉพาะ whitespace(ช่องว่าง)
\S=หาอะไรก็ได้ที่ไม่ใช่ whitespace(ช่องว่าง) ก็จะได้ทุกตัวในข้อมูล (แต่ไม่เป็นชุด) ถ้าอยากได้แบบเป็นชุด ก็เติม +
\w=หาตัวอักษรและตัวเลข = [a-zA-Z_0-9]
\W=หาอะไร ที่ไม่ใช่ตัวอักษรและตัวเลข = [^a-zA-Z_0-9]
*=มีหรือไม่มีก็ได้ เช่น at*
+=มี 1 หรือมากกว่า 1 ตัว
? =ไม่มีเลย หรือมีแค่ 1 ตัวเท่านั้น
{x}= x =แทนจำนวนของสิ่งที่ต้องการค้นหา เช่น \d{5}
{x,y} =x =แทนจำนวนอย่างน้อยที่ต้องการค้นหา ,y =จำนวนสูงสุดที่ต้องการค้นหา เช่น \d{2, 3}
Regular Expression หรือเรียกย่อๆว่า Regex
หมายถึง รูปแบบของลำดับ หรือกลุ่มของสัญลักษณ์ ที่ใช้แทนลำดับ หรือกลุ่มของอักขระตามที่ต้องการ
regexp ถือเป็น จุดเด่น ของ perl ที่ ภาษาอื่นๆ เอาไปใช้ตาม แต่ปรับเปลี่ยน ให้ดีขึ้น ใช้ง่ายขึ้น ฯลฯ
แล้วก็รูปแบบอาจจะแตกต่างกันนิดๆหน่อยๆ
สัญลักษณ์ของ Regular expression
^
คำ/อักษรที่อยู่หน้าเครื่องหมายนี้ ต้องเป็นคำขึ้นต้นของข้อความที่นำมาตรวจสอบ
เช่น
/^การ/ เป็นการกำหนดว่า คำที่นำมาตรวจสอบต้องขึ้นต้นด้วยคำว่า การ เช่น “การทำดี” “การบ้าน” เป็นต้น คำพวกนี้จะผ่านการทดสอบ
$
คำ/อักษรที่อยู่หน้าเครื่องหมายนี้ ต้องอยู่ตอนท้ายของข้อความที่นำมาตรวจสอบ
เช่น
/มา$/ จะถือว่าคำต่อไปนี้ถูกตามเงื่อนไข “ตามา” “ขอขมา” หรือแม้แต่คำว่า “หมา” แต่คำว่า “ทำดี” จะไม่ผ่าน เพราะไม่ได้ลงท้ายด้วยคำว่า “มา” ตามเงื่อนไขนั่นเอง
+
คำ/อักษรที่อยู่หน้าเครื่องหมายนี้ ต้องมีปรากฏในคำที่นำมาตรวจสอบ อย่างน้อย 1 ตัว
เช่น
/ท+/ จะถือว่าคำต่อไปนี้ผ่านการตรวจสอบ เช่น “ทองจุล” “วันทนา” “ถนนหนทางทุกแห่ง”
?
คำ/อักษรที่อยู่หน้าเครื่องหมายนี้ อาจะมีปรากฏในคำที่นำมาตรวจสอบ หรือไม่ก็ได้ ถ้ามีจะมีกี่ตัวก็ได้
เช่น
/ก?ข+$/ หมายถึง อาจจะมีด้วยตัว ก และอักษรตัวสุดท้ายต้องมีตัว ข อย่างน้อย 1 ตัว (เครื่องหมาย + แสดงว่ามีอย่างน้อย 1 และ เครื่องหมาย $ แสดงว่าเป็นตัวสุดท้าย)
*
ตัวอักษรที่อยู่หน้าเครื่องหมายนี้ จะเป็นตัวอักษรนี้ซ้ำกันกี่ตัวก็ได้ และจะมีหรือไม่มีก็ได้
\s
ช่องว่าง, เว้นวรรค, Space bar หรือ whitespace
.
ใช้แทนตัวอักษรอะไรก็ได้
เช่น
/ก.[0-9]/ หมายถึง ตัว ก ตามด้วยตัวอักษรอะไรก็ได้ และต่อด้วยเลขอารบิค เลข 0-9
/^.{3}$/ หมายถึง ต้องมีตัวอักษรเพียง 3 ตัวเท่านั้น เป็นตัวเลข ตัวอักษร ภาษาไทย ภาษาอังกฤษ ได้ทั้งนั้น
[ ]
ใช้ระบุตำแหน่งในคำว่า ในตำแหน่งนี้จะมีตัวอักษรอะไรได้บ้าง
เช่น
/[นร]/ เป็นการกำหนดว่า คำที่นำมาตรวจสอบ ต้องเป็นตัว น หรือ ตัว ร เท่านั้นจึงจะผ่าน มีความหมายเช่นเดียวกับ “น|ร”
/[ก-ค]/ เป็นการบอกว่า คำที่นำมาจะต้องเป็น ตัว ก ข ค เท่านั้น เช่น ในกรณีเลขประจำตัวที่ขึ้นต้นด้วย ก ข หรือ ค เท่านั้น ถ้าพิมพ์ตัวแรกเป็นตัวอักษรตัวอื่นก็แสดงว่าพิมพ์ผิด เราจะเขียนได้ดังนี้ ^[ก-ค]
/^[a-zA-Z]/ เป็นการบอกว่า คำที่นำมาตรวจสอบต้องขึ้นต้นด้วยตัวอักษร จะเป็นตัวเล็ก คือ a ถึง z หรือ ตัวใหญ่ คือ A ถึง Z ก็ได้
/[0-9๐-๙]%/ เป็นการบอกว่า ให้มีตัวเลข 1 ตัว เลขอะไรก็ได้ เลข 0 ถึง เลข 9 เป็นได้ทั้งเลขไทยและอารบิค ต่อด้วยเครื่องหมาย %
/[ก-๙]/ ตัว ก ถึง ฮ รวมทั้งสระทุกตัว และ ตัวเลขไทย ๐ ถึง ๙
/[0-9๐-๙]/ เลข 0-9 ทั้งเลขไทยและฝรั่ง
/^[0-9๐-๙]+$/ ให้มีเฉพาะตัวเลข 0-9 เลขไทยหรือเลขฝรั่งก็ได้ แต่ห้ามมีตัวอักษรใด ๆ
/^[กข]{3}[-][0-9]$/ ขึ้นต้นด้วยตัว ก หรือ ข จำนวน 3 ตัว ต่อด้วยเครื่องหมาย – และจบด้วยตัวเลขอารบิค เลข 0-9 เช่น “กขก-5” “กกก-3” เป็นต้น สิ่งต่อไปนี้จะไม่ผ่านหรือเป็นเท็จ เช่น “กกกขข” เพราะ ตัวที่ 4 ไม่ใช้เครื่องหมาย – และตัวสุดท้ายไม่ใช่ตัวเลข “ขขข-๘” ตัวเลขสุดท้ายเป็นเลขไทย
ไม่ว่าตัวอักษร หรือสัญลักษณ์ใด ๆ ที่อยู่ภายในเครื่องหมาย [ ] จะกลายเป็นสัญลักษณ์ธรรมดา เช่น + กลายเป็นเครื่องหมายบวก แทนที่จะหมายถึงว่า ต้องมีตัวอักษรอย่างน้อย 1 ตัว
{ }
แสดงจำนวนครั้งที่ซ้ำกัน
เช่น
/กข{2}/ หมายถึงให้มีตัว ข จำนวน 2 ตัว เช่น “กขข”
/กข{2,}/ หมายถึงให้มีตัว ข อย่างน้อย 2 ตัว เช่น “กขขขข”
/กข{3,5}/ หมายถึงให้มีตัว ข จำนวน 3-5 ตัวเท่านั้น คือ “กขขข” “กขขขข” และ “กขขขขข”
( )
ใช้รวมกลุ่มเข้าด้วยกันเป็นส่วนเดียวกัน
เช่น
/ก(ขค)*/ หมายถึง ตัว ก และอาจจะตามด้วยตัว ขค หรือไม่มีตัว ขค ก็ได้ เครื่องหมาย * แสดงว่าจะมีหรือไม่ก็ได้
/ก(ขค){1,5}/ หมายถึง ตัว ก แล้วจะตามด้วย ขค จำนวน 1-5 ชุด เช่น “กขคขคขค” หรือ “กขคขค” ก็ได้
|
เสนอทางเลือกอย่างใดอย่างหนึ่ง
เช่น
/การ|ความ/ เป็นการบอกว่า จะใช้คำว่า การ หรือ ความ ก็ได้
/(ก|ขค)งจ/ เช่น กงจ หรือ ขคงจ ก็ได้
^[1-9][0-9]*$
ขึ้นต้นด้วยเลข 1-9 และอาจจะต่อด้วย เลข 0-9 กี่ตัวก็ได้ ในกรณีนี้ ถ้าเป็นเลข 0 ก็จะไม่ผ่าน จะผ่านตั้งแต่ 1 2 3 4 ไปเรื่อย ๆ
^(0|[1-9][0-9]*)$
อาจจะขึ้นต้นด้วยเลข 0 หรือเลข 1-9 ก็ได้ และอาจจะต่อด้วยเลข 0-9 ในกรณีนี้ เราใช้ตรวจสอบการพิมพ์ที่เป็นตัวเลขตั้งแต่ 0 ขึ้นไป ถ้ามีตัวอักษร ก็จะไม่ผ่านการตรวจสอบ หรือ เป็นเท็จ นั่นเอง
^(0|-?[1-9][0-9]*)$
เหมือน ^(0|[1-9][0-9]*)$ เพียงแต่ ถ้าไม่ขึ้นต้นด้วยเลข 0 สามารถมีเครื่องหมาย ลบ ได้ หรือจะไม่มีเครื่องหมายลบ ก็ได้ เครื่องหมาย ? แสดงว่า จะมีหรือไม่มี ก็ได้
^[0-9]+(\.[0-9]+)?$
ขึ้นต้นด้วย 0-9 อย่างน้อย 1 ตัว และอาจจะมี จุดและต่อด้วยตัวเลข 0-9 อย่างน้อย 1 ตัว อย่างนี้ เป็นการบอกว่าจะทศนิยมหรือไม่มีก็ได้ (สังเกตเครื่องหมาย ? อยู่หลังกลุ่มทั้งหมดซึ่งอยู่ในวงเล็บ เป็นการบอกว่า กลุ่มนี้ คือ (\.[0-9]+) จะมีหรือไม่มีก็ได้) แต่จะมีแค่ จุดเฉย ๆ เช่น 15. อย่างนี้ไม่ได้ ต้องเป็น 15.2 หรือ 15.38 ก็ได้ (เพราะเครื่องหมาย + อยู่หลัง [0-9] แสดงว่า ตำแหน่งนี้ คือต่อจาก จุด ยังไง ๆ ก็ต้องมีตัวเลข 0 ถึง 9 อย่างน้อย 1 ตัว จะเป็น 2 ตัว 5 ตัว 10 ตัว ก็ได้)
^[0-9]+(\.[0-9]{2})?$
เหมือนข้างบน แต่บังคับว่า ถ้ามีทศนิยม ทศนิยมต้องมี 2 ตำแหน่งเท่านั้น เครื่องหมาย {} กำหนดว่าจะต้องมีซ้ำกี่ครั้ง
^[0-9]+(\.[0-9]{1,2})?$
เหมือนข้างบน แต่อนุญาตให้มีทศนิยม 1 หรือ 2 ตำแหน่ง สังเกตการเขียนตัวเลข ในระหว่างเครื่องหมาย { และ }
^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$
ต้องขึ้นต้นด้วยตัวเลข 0-9 หรือ อาจจะตามด้วยเครื่องหมาย คอมม่า และตัวเลข 0-9 อีก 3 ตัว และอาจจะต่อด้วยทศนิยม 1 หรือ 2 ตำแหน่ง
^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(\.[0-9]{1,2})?$ เหมือนข้างบน แต่กำหนดให้การมีเครื่องหมาย คอมม่า อาจจะมีหรือไม่มีก็ได้ วิธีกำหนดทางเลือกใช้เครื่องหมาย | แทนที่จะใช้ ? การเลือกใช้ต้องอยู่ที่เราจะตัดสินใจว่าจะเลือกใช้อะไรจึงจะเหมาะสม นี่แหละเสน่ห์ของการเขียนโปรแกรม มีวิธีการหลายอย่างที่จะได้มาซึ่งผลลัพธ์อย่างเดียวกัน แต่อย่างไหนจะเหมาะ ต้องเลือกดู เลือกใช้ให้เหมาะสม
อัขระพิเศษที่ใช้ใน regexp
[] range specificication (e.g., [a-z] means a letter in the range a to z)
\w letter or digit; same as [0-9A-Za-z]
\W neither letter or digit
\s space character; same as [ \t\n\r\f]
\S non-space character
\d digit character; same as [0-9]
\D non-digit character
\b backspace (0x08) (only if in a range specification)
\b word boundary (if not in a range specification)
\B non-word boundary
* zero or more repetitions of the preceding
+ one or more repetitions of the preceding
{m,n} at least m and at most n repetitions of the preceding
? at most one repetition of the preceding; same as {0,1}
| either preceding or next expression may match
() grouping
ตัวอย่างการใช้งาน regexp แบบทั่วๆไป
/[abcde]/ # เทียบได้กับ ตัวอักษร a, b, c, d,e
/[0123456789]/ # เทียบได้กับ ตัวเลขใดๆหนึ่งตัว
/[0-9]/ # เทียบได้กับ ตัวเลขใดๆหนึ่งตัว
/[a-zA-Z0-9_]/ # เทียบได้กับ ตัวเลข, ตัวอักษร หรือ ขีดล่าง หนึ่งตัว
/[^0-9]/ # เทียบได้กับอะไรก็ได้หนึ่งตัว ที่ไม่ใช่ตัวเลข
/[^aeiouAEIOU]/ # เทียบได้กับอะไรก็ได้หนึ่งตัว ที่ไม่ใช่สระในภาษาอังกฤษ
/\d/ #มีค่าเท่ากับ /[0-9]/
/\D/ #มีค่าเท่ากับ /[^0-9]/
/\w/ #มีค่าเท่ากับ /[a-zA-Z0-9_]/
/\W/ #มีค่าเท่ากับ /[^a-zA-Z0-9_]/
/\s/ #มีค่าเท่ากับ /[\r\t\n\f]/
/\S/ #มีค่าเท่ากับ /[^\r\t\n\f]/
ตัวอย่างการใช้งาน regexp แบบ Multi-character Patterns หรือ Grouping Patterns
ในข้อข้อนี้เราจะมีสัญญาลักษณ์อยู่ 3 ตัว คือ
* หมายความว่า ศูนย์หรือมากว่า
+ หมายความว่า หนึ่งหรือมากว่า
? หมายความว่า ศูนย์หรือหนึ่ง
เช่น
/x+/ # หมายถึงมี x อย่างน้อยหนึ่งตัว
แล้วถ้าสมมุติว่าเราต้องการบอกว่ามี x ตั้งแต่ 5 ถึง 10 ตัว
เราสามารถเขียนเป็น /x{5,10}/ เราอาจใช้วิธีเขียนแบบนี้แทนการใช้ *, +, ? ได้เป็น {0,}, {1,},{0,1}
และยังมีอีกเครื่องหมายหนึ่งที่ใช้อื่นๆอีก เช่น
/song|blue/ # ใช้เครืองหมาย | หมายถึงเป็น คำว่า song หรือคำว่า blue ก็ได้
/^real/ # ใช้เครืองหมาย ^ หมายถึง string ที่ขึ้นต้นด้วยคำว่า real
/real$/ # ใช้เครืองหมาย $ หมายถึง string ที่ลงท้ายด้วยคำว่า real
ตัวอย่างการใช้งาน regexp แบบ Multi-character Patterns หรือ Grouping Patterns เพิ่มเติม
. ก็คือตัวอะไรก็ได้ ไม่ว่าจะเป็น ช่องว่าง หรือว่า a ก็ ใช้ . แทนได้หมด
.+ คือ ตัวอะไรก็ได้ กี่ตัวก็ได้ แต่ต้องมีอย่างน้อย 1 ตัว (ไม่มีไม่ได้)
? คือ ตัวอะไรก็ได้ 1 ตัว ซึ่งจะมีหรือไม่มีก็ได้
.a คือ ตัวอะไรก็ได้รวมถึงเครื่องหมายเว้นวรรคต่างๆ 1 ตัว แต่ต้องตามด้วย a เช่น aa ba ca 5a 9a pa หรือแม้กระทั่ง เว้นวรรคa
a.a คือ ตัว a แล้วตามด้วยตัวอะไรก็ได้ แล้วตามด้วย a เช่น a0a aaa asa รวมถึง aเว้นวรรคa แต่ว่า aa เฉยๆ ไม่ได้ (ต้องมี 3 ตำแหน่งเท่านั้น)
.? คือ ตัวอะไรก็ได้รวมถึงเครื่องหมายเว้นวรรคต่างๆ 1 ตัว แต่จะมีหรือไม่มีก็ได้
a.? คือ ตัว a แล้วตามด้วยตัวอะไรก็ได้ จะมีหรือไม่มีก็ได้ เช่น aเฉยๆ aเว้นวรรค aa as a1 ae แต่ sa ไม่ใช่ (ต้องขึ้นด้วย a เท่านั้น)
a.?a คือ ตัว a แล้วตามด้วยตัวอะไรก็ได้ จะมีหรือไม่ก็ได้ แต่ต้องตามด้วย a เช่น asa aaa a0a aoa aเว้นวคครa หรือ aa
.+ คือ ตัวอะไรก็ได้รวมถึงเครื่องหมายเว้นวรรคต่างๆ กี่ตัวก็ได้
a+ คือ ตัว a กี่ตัวก็ได้ เช่น aa aaaaaa aaaaaaaaa รวมถึง a เฉยๆ แต่ aaaaaaaaaas ไม่ใช่ (ต้องมีแค่ a เท่านั้น)
a.+ คือ a แล้วตามด้วยตัวอะไรก็ได้ กี่ตัวก็ได้ เช่น a0000000000 askjkljhi906klsd a9 a8a a666 aเว้นวรรค0259skfk
a.+a คือ a แล้วตามด้วยตัวอะไรก็ได้ กี่ตัวก็ได้ แต่ต้องตามหลังด้วย a เช่น aaa asa aเว้นวรรคa assssssssa a23s554a aเว้นวรรคเว้นวรรคเว้นวรรคa แต่ aa ไม่ใช่ เพราะ ต้อง 3 ตำแหน่งขึ้นไปเท่านั้น
ดังนั้น การเขียน regexp เวลาเจอคำที่พลิกแพลง random มา
เช่น D UaN G E OaN หรือ D U NaGaE OaN
ให้ใส่ไปว่า D.U.N.G.E.O.N ก็จะถึอว่า match ทั้งหมด (เจอหมด)http://blog.stephack.com/2012/05/regular-expression-cheats.html