บทเรียนพิเศษ 38 Regular Expressions (2)
สัญลักษณ์พิเศษต่างๆ
สัญลักษณ์พิเศษต่างๆ ของ Reg ช่วยให้คุณขยายขอบเขตของข้อความที่ต้องการค้นหาหรือแทนที่ได้ง่ายขึ้น โปรดอย่าคิดว่ามันเป็นตัวประหลาดหรือทำให้คุณยุ่งยากแต่อย่างใด เพราะมิเช่นนั้น มันจะเป็นอย่างนั้นจริงๆ(เอ๊ะ...ยังไง) สัญลักษณ์พิเศษต่างแบ่งออกได้เป็น 3 ประเภท
1. สัญลักษณ์พิเศษที่ใช้แทนที่อักษรหรือสัญลักษณ์ตัวหนึ่งในข้อความ(string)
2. สัญลักษณ์ที่ทำหน้าที่ทำซ้ำตัวอักษรหรือสัญลักษณ์
3. สัญลักษณ์พิเศษที่ใช้ระบุตำแหน่งอักษรหรือสัญลักษณ์
1. สัญลักษณ์พิเศษที่ใช้แทนที่อักษรหรือสัญลักษณ์ตัวหนึ่งในข้อความ(string)
\d หมายถึง เลขตัวใดตัวหนึ่งจาก 0 ถึง 9 สมมติว่าคุณต้องการค้นหาตัวเลข 100 ถึง 199 คุณสามารถเขียนเป็น Reg ว่า /1\d\d/
\D หมายถึง ตัวอักษรหรือสิ่งที่ไม่ใช่ตัวเลข
\w หมายถึง ตัวอักษรภาษาอังกฤษหรือตัวเลข และรวมถึงเครื่องหมายขีดล่าง( _ )
\W หมายถึง ตัวอักษรไทยหรือที่ว่างหรือสัญลักษณ์ต่างๆซึ่งไม่ได้อยู่ใน \w
\s หมายถึง ที่ว่าง(space) ซึ่งรวมถึง tabs และ carriage returns
\S หมายถึง ตัวอักษร ตัวเลขหรือสัญลักษณ์ต่างๆ ซึ่งไม่ใช่ที่ว่าง
. (จุด) หมายถึง ตัวอักษรหรือสัญลักษณ์ต่างๆหรือที่ว่าง (ครอบคลุมทุกสิ่งทุกอย่าง)
[...] เป็น รูปแบบที่ใช้บอกค่าต่างๆที่อาจเป็นไปได้ในตำแหน่งนั้นๆ เช่น หากคุณใช้ /[กจสห]ด/g นั่นจะหมายถึงคำว่า "กด" "จด" "สด" และ "หด"
[.-.] เป็น รูปแบบที่ใช้บอกค่าต่างๆที่อาจเป็นไปได้ในตำแหน่งนั้นๆ โดยใช้ตัวอักษรหรือตัวเลขที่ครอบคลุมเป็นช่วงๆ เช่น หากคุณใช้ /[ก-ส]ด/g นั่นจะหมายถึงคำว่า "กด" "จด" และ "สด" (ทดสอบแล้วครับ เชื่อผมได้ ใช้ได้ทั้งกับตัวอักษรภาษาอังกฤษและตัวเลข)
[^...] เป็น รูปแบบที่ใช้บอกการยกเว้นคำหรือสัญลักษณ์ต่างๆ เช่น หากคุณใช้ /[^ก-ส]ด/g นั่นจะหมายถึงอะไรก็ได้ที่มี ด เด็ก ติดอยู่ แต่ ไม่ใช่ "กด" "จด" และ "สด"
\D หมายถึง ตัวอักษรหรือสิ่งที่ไม่ใช่ตัวเลข
\w หมายถึง ตัวอักษรภาษาอังกฤษหรือตัวเลข และรวมถึงเครื่องหมายขีดล่าง( _ )
\W หมายถึง ตัวอักษรไทยหรือที่ว่างหรือสัญลักษณ์ต่างๆซึ่งไม่ได้อยู่ใน \w
\s หมายถึง ที่ว่าง(space) ซึ่งรวมถึง tabs และ carriage returns
\S หมายถึง ตัวอักษร ตัวเลขหรือสัญลักษณ์ต่างๆ ซึ่งไม่ใช่ที่ว่าง
. (จุด) หมายถึง ตัวอักษรหรือสัญลักษณ์ต่างๆหรือที่ว่าง (ครอบคลุมทุกสิ่งทุกอย่าง)
[...] เป็น รูปแบบที่ใช้บอกค่าต่างๆที่อาจเป็นไปได้ในตำแหน่งนั้นๆ เช่น หากคุณใช้ /[กจสห]ด/g นั่นจะหมายถึงคำว่า "กด" "จด" "สด" และ "หด"
[.-.] เป็น รูปแบบที่ใช้บอกค่าต่างๆที่อาจเป็นไปได้ในตำแหน่งนั้นๆ โดยใช้ตัวอักษรหรือตัวเลขที่ครอบคลุมเป็นช่วงๆ เช่น หากคุณใช้ /[ก-ส]ด/g นั่นจะหมายถึงคำว่า "กด" "จด" และ "สด" (ทดสอบแล้วครับ เชื่อผมได้ ใช้ได้ทั้งกับตัวอักษรภาษาอังกฤษและตัวเลข)
[^...] เป็น รูปแบบที่ใช้บอกการยกเว้นคำหรือสัญลักษณ์ต่างๆ เช่น หากคุณใช้ /[^ก-ส]ด/g นั่นจะหมายถึงอะไรก็ได้ที่มี ด เด็ก ติดอยู่ แต่ ไม่ใช่ "กด" "จด" และ "สด"
ฝรั่งบอกว่าพวกนี้เป็นเพียงสัญลักษณ์พื้นฐานพิเศษพื้นฐาน แสดงว่า ต้องมีตัวประหลาดมากกว่านี้อีก ซึ่งถ้าคุณอยากรู้ก็ขอให้ไปหาเอาเองนะครับ ผมจะเป็นกำลังใจให้ ลองมาดูตัวอย่างการใช้กันครับ... สมมติว่าคุณต้องการค้นหารหัสประจำตัวนักศึกษา(เป็นเลข 8 หลัก)จากข้อมูลกลุ่มใหญ่กลุ่มหนึ่ง คุณก็อาจจะเขียน Reg ว่า... /\d\d\d\d\d\d\d\d/gi ซึ่งมันยาวมากเลยใช่มั้ยครับ แล้วถ้าในข้อมูลดันมีเลข 10 หลักโผล่ออกมา ก็จะถูกรวมอยู่ในเลข 8 หลักที่ค้นเจอด้วย ซึ่งมันไม่ถูกน่ะครับ ...แต่เรามีวิธีช่วยให้การเขียนสั้นลงและมีความถูกต้องมากขึ้น ด้วยสัญลักษณ์พิเศษอีก 2 ประเภทที่เหลือ
2. สัญลักษณ์ที่ทำหน้าที่ทำซ้ำตัวอักษรหรือสัญลักษณ์
{n} หมายถึง สิ่งที่อยู่ในตำแหน่งนั้นต้องซ้ำ n ครั้ง เช่น คุณสามารถเขียน Reg แทนเลข 8 หลัก ว่า /\d{8}/
{n,} หมายถึง สิ่งที่อยู่ในตำแหน่งนั้นต้องซ้ำ n ครั้งหรือมากกว่า
{n,m} หมายถึง สิ่งที่อยู่ในตำแหน่งนั้นต้องซ้ำ n ครั้งหรือมากกว่า แต่ไม่เกิน m ครั้ง เช่น หากคุณต้องการทดสอบว่า password ที่ผู้ใช้พิมพ์เข้ามาในรูปภาษาอังกฤษและตัวเลข มีความยาวอยู่ระหว่าง 6 ถึง 12 ตัว คุณสามารถเขียนได้ว่า \w{6,12}/
? หมายถึง สิ่งที่อยู่ในตำแหน่งนั้นอาจมีอยู่ครั้งเดียวหรือไม่มีเลยก็ได้ เช่น หากคุณต้องการค้นหา รหัสที่มีเลข 6 หลักและหน้าเลขอาจมีสัญลักษณ์หรือตัวอักษรนำหน้าตัวเดียว คุณอาจเขียนว่า /\D?\d{6}/
+ หมายถึง สิ่งที่อยู่ในตำแหน่งนั้นต้องมีอยู่อย่างน้อยหนึ่งครั้ง
* หมายถึง สิ่งที่อยู่ในตำแหน่งนั้นอาจไม่มีอยู่หรือมีอยู่กี่ครั้งก็ได้ ซึ่งคุณควรใช้สัญลักษณ์นี้ด้วยความระมัดระวัง ยกตัวอย่างเช่น /a*/ อาจหมายถึง คำภาษาอังกฤษจำนวนมากที่มีอักษร a อยู่ซึ่งอาจครอบคลุมคำที่คุณไม่ต้องการค้นหา
{n,} หมายถึง สิ่งที่อยู่ในตำแหน่งนั้นต้องซ้ำ n ครั้งหรือมากกว่า
{n,m} หมายถึง สิ่งที่อยู่ในตำแหน่งนั้นต้องซ้ำ n ครั้งหรือมากกว่า แต่ไม่เกิน m ครั้ง เช่น หากคุณต้องการทดสอบว่า password ที่ผู้ใช้พิมพ์เข้ามาในรูปภาษาอังกฤษและตัวเลข มีความยาวอยู่ระหว่าง 6 ถึง 12 ตัว คุณสามารถเขียนได้ว่า \w{6,12}/
? หมายถึง สิ่งที่อยู่ในตำแหน่งนั้นอาจมีอยู่ครั้งเดียวหรือไม่มีเลยก็ได้ เช่น หากคุณต้องการค้นหา รหัสที่มีเลข 6 หลักและหน้าเลขอาจมีสัญลักษณ์หรือตัวอักษรนำหน้าตัวเดียว คุณอาจเขียนว่า /\D?\d{6}/
+ หมายถึง สิ่งที่อยู่ในตำแหน่งนั้นต้องมีอยู่อย่างน้อยหนึ่งครั้ง
* หมายถึง สิ่งที่อยู่ในตำแหน่งนั้นอาจไม่มีอยู่หรือมีอยู่กี่ครั้งก็ได้ ซึ่งคุณควรใช้สัญลักษณ์นี้ด้วยความระมัดระวัง ยกตัวอย่างเช่น /a*/ อาจหมายถึง คำภาษาอังกฤษจำนวนมากที่มีอักษร a อยู่ซึ่งอาจครอบคลุมคำที่คุณไม่ต้องการค้นหา
ผมขอยกตัวอย่าง การใช้สัญลักษณ์ทำซ้ำที่ซับซ้อนขึ้นมา ในการค้นหาหรือกรอกหมายเลขบัตรประชาชน ซึ่งมี 13 หลัก และมีรูปแบบที่ควรเป็นไปได้ดังนี้...
0 1234 56789 12 3
หรืออาจมีคนใช้ 0123456789123
หรืออาจมีคนใช้ 0 1234 56789123
หรืออาจมีคนใช้ 0 1234 56789 123 . . . . . .
หรืออาจมีคนใช้ 0123456789123
หรืออาจมีคนใช้ 0 1234 56789123
หรืออาจมีคนใช้ 0 1234 56789 123 . . . . . .
ในข้อมูลหมายเลขบัตรจำนวนมาก อาจมีการเว้นวรรคหรือไม่เว้นดังที่แสดง ในการเขียน Reg ให้ครอบคลุมทุกๆกรณี คุณอาจเริ่มต้นด้วย
/\d \d\d\d\d \d\d\d\d\d \d\d \d/g
ส่วนการเว้นวรรค อาจมีหรือไม่มีก็ได้ เราก็เพิ่มเครื่องหมาย ? เข้าไป :
/\d ?\d\d\d\d ?\d\d\d\d\d ?\d\d ?\d/g
เราอาจใช้สัญลักษณ์ทำซ้ำเพื่อให้เขียนและอ่านได้ง่ายขึ้น :
/\d ?\d{4} ?\d\{5} ?\d{2} ?\d/g
3. สัญลักษณ์พิเศษที่ใช้ระบุตำแหน่งอักษรหรือสัญลักษณ์
\b (ใช้ได้แต่กับภาษาอังกฤษ) ใช้ระบุขอบเขตของคำว่ามีการจำกัด เช่น หากคุณต้องการค้นหาแต่ on ที่อยู่เดี่ยวๆ ไม่ได้อยู่ภายในคำอื่น ให้คุณใช้ /\bon\b/gi
\B (ใช้ได้แต่กับภาษาอังกฤษ) ใช้ระบุขอบเขตของคำว่าไม่ได้จำกัด เช่น หากคุณต้องการค้นหาคำว่า "Paula" และ "Pauline" แต่ไม่เอา "Paul" ให้คุณใช้ /\bpaul\B/gi
^ ใช้ระบุเป็นสิ่งที่อยู่อันดับแรกในข้อความ(string) เช่น หากคุณต้องการตรวจว่า เลข 1 เป็นสิ่งที่อยู่หน้าสุดของข้อความหรือเปล่า ให้ใช้ /^1\b/
$ ใช้ระบุเป็นสิ่งที่อยู่อันดับสุดท้ายในข้อความ(string) เช่น หากคุณต้องการตรวจว่า "จบ" เป็นสิ่งที่อยู่ท้ายสุดของข้อความหรือเปล่า ให้ใช้ /จบ$/
\B (ใช้ได้แต่กับภาษาอังกฤษ) ใช้ระบุขอบเขตของคำว่าไม่ได้จำกัด เช่น หากคุณต้องการค้นหาคำว่า "Paula" และ "Pauline" แต่ไม่เอา "Paul" ให้คุณใช้ /\bpaul\B/gi
^ ใช้ระบุเป็นสิ่งที่อยู่อันดับแรกในข้อความ(string) เช่น หากคุณต้องการตรวจว่า เลข 1 เป็นสิ่งที่อยู่หน้าสุดของข้อความหรือเปล่า ให้ใช้ /^1\b/
$ ใช้ระบุเป็นสิ่งที่อยู่อันดับสุดท้ายในข้อความ(string) เช่น หากคุณต้องการตรวจว่า "จบ" เป็นสิ่งที่อยู่ท้ายสุดของข้อความหรือเปล่า ให้ใช้ /จบ$/
เป็นไงบ้างครับ กับ ตัวประหลาดเหล่านี้ ที่ผมเห็นเป็นตัวประหลาด เพราะผมไม่เคยนำมาใช้อะไรเลย มันอาจมีประโยชน์มากๆสำหรับคุณ และกลายเป็นตัวน่ารักสุดๆก็เป็นได้... แต่เรื่อง Reg ยังไม่จบแค่นี้ครับ ในบทถัดไป เราจะพูดถึงการจัดกลุ่มภายใน Reg และคำสั่งต่างๆที่ใช้กับ Reg ซึ่งทำให้ช่วยเพิ่มขีดจำกัดและประโยชน์ของ Reg ให้มากขึ้นไปอีกครับ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น