4 ก.ย. 2554

บทเรียนพิเศษ 38 Regular Expressions (2)

บทเรียนพิเศษ 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   นั่นจะหมายถึงอะไรก็ได้ที่มี ด เด็ก ติดอยู่ แต่ ไม่ใช่ "กด" "จด" และ "สด"

                    ฝรั่งบอกว่าพวกนี้เป็นเพียงสัญลักษณ์พื้นฐานพิเศษพื้นฐาน แสดงว่า ต้องมีตัวประหลาดมากกว่านี้อีก ซึ่งถ้าคุณอยากรู้ก็ขอให้ไปหาเอาเองนะครับ ผมจะเป็นกำลังใจให้ ลองมาดูตัวอย่างการใช้กันครับ... สมมติว่าคุณต้องการค้นหารหัสประจำตัวนักศึกษา(เป็นเลข 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 อยู่ซึ่งอาจครอบคลุมคำที่คุณไม่ต้องการค้นหา
                    ผมขอยกตัวอย่าง การใช้สัญลักษณ์ทำซ้ำที่ซับซ้อนขึ้นมา ในการค้นหาหรือกรอกหมายเลขบัตรประชาชน ซึ่งมี 13 หลัก และมีรูปแบบที่ควรเป็นไปได้ดังนี้...
0 1234 56789 12 3
หรืออาจมีคนใช้   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) เช่น หากคุณต้องการตรวจว่า "จบ" เป็นสิ่งที่อยู่ท้ายสุดของข้อความหรือเปล่า ให้ใช้ /จบ$/



                    เป็นไงบ้างครับ กับ ตัวประหลาดเหล่านี้ ที่ผมเห็นเป็นตัวประหลาด เพราะผมไม่เคยนำมาใช้อะไรเลย มันอาจมีประโยชน์มากๆสำหรับคุณ และกลายเป็นตัวน่ารักสุดๆก็เป็นได้...   แต่เรื่อง Reg ยังไม่จบแค่นี้ครับ ในบทถัดไป เราจะพูดถึงการจัดกลุ่มภายใน Reg และคำสั่งต่างๆที่ใช้กับ Reg ซึ่งทำให้ช่วยเพิ่มขีดจำกัดและประโยชน์ของ Reg ให้มากขึ้นไปอีกครับ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น

 
;