ใน Regular Expression วิธีการเขียน pattern ให้ตรวจสอบว่า จะต้องขึ้นต้นด้วยตัวเลขเท่านั้น หรือจะต้องขึ้นต้นด้วยตัวอักษรภาษาอังกฤษเท่านั้น ทำได้ง่าย ๆ โดยการเติมสัญลักษณ์ ^ เข้าไปด้านหน้า ทีนี้ เราอยากเปลี่ยน pattern ให้ตรวจสอบเป็น ห้ามขึ้นด้วยตัวเลขนะ หรือห้ามขึ้นด้วยตัวอักษรภาษาอังกฤษนะ จะทำยังไงดีล่ะ…
มาดูกัน ![]()
วิธีง่าย ๆ ที่มานำเสนอก็คือ การใช้สิ่งที่เรียกว่า Zero-width negative look ahead assertion ครับ แค่ชื่อก็ปวดหัวตึ้บ… เดี๋ยวก่อนครับ วิธีการใช้งานมันง่ายกว่าชื่อของมันครับ เพียงแค่เราใส่ ^(?! และ ) ครอบสิ่งที่เราไม่ต้องการให้ขึ้นต้น เท่านั้นเป็นอันจบครับ
ยกตัวอย่างเช่น เราไม่ต้องการให้ขึ้นต้นด้วย abc แต่หลังจากนั้นจะเป็นอะไรก็ได้ เราก็ใช้ pattern เป็น ^(?!abc)\w+ ครับ ทีนี้ คำที่ขึ้นต้นด้วย abc ทั้งหมด จะ fail ในการ match กับ pattern ครับ
ไอ้เจ้า Zero-width negative look ahead assertion จริง ๆ แล้วมันมีอะไรมากกว่านั้นครับ อธิบายต่ออีกหน่อยละกัน สาเหตุที่เราเรียกว่า Zero-width assertion เพราะเราไม่นับว่ามันเป็นตัวอักษร และมันจะทำหน้าที่สำหรับตรวจดูว่าจะเอาไป match ได้หรือเปล่าเท่านั้น โดยไม่เอาค่าในวงเล็บไปใส่ในผลการ match
นอกเหนือจาก negative look ahead แล้ว มันยังมีรูปแบบอื่น ๆ ที่เกี่ยวข้องด้วย รวมแล้วมี 4 แบบ คือ positive look ahead, negative look ahead, positive look behind และ negative look behind… มาดูกันทีละตัวเลยครับ
Positive Look Ahead จะใช้สำหรับการ match ที่ตามหลังกัน เขียนอยู่ในรูปแบบ q(?=u) หมายถึง จะ match กับ q ที่ตามด้วย u เท่านั้น (เราจะสังเกตได้ว่า q จะถูกนำไปใส่ในผลการ match แต่ u ไม่ถูกนำไปรวม เพราะว่ามันเป็น zero-width assertion ไงครับ)
Negative Look Ahead อันนี้พูดถึงไปแล้วตั้งแต่แรก ใช้สำหรับการ match สิ่งที่ไม่ตามกัน เขียนในรูปแบบ q(?!u) หมายถึงว่า จะ match กับ q ที่ไม่ได้ตามด้วย u (จากตัวอย่างแรกของเรา เขียนเริ่มต้นว่า ^(?!abc) นั่นคือ เริ่มต้นประโยค หรือ ^ ที่ไม่ตามด้วย abc หรือ (?!abc) นั่นเอง)
Positive Look Behind จะคล้าย ๆ กับ Positive Look Ahead ครับ แต่ทำจากด้านหลังมา เขียนอยู่ในรูปแบบ (?<=a)b จะหมายถึงว่า จะ match กับ b ที่ตามหลัง a อยู่
Negative Look Behind ก็ในทำนองเดียวกันกับ Negative Look Ahead เลยครับ ทำจากด้านหลังมา เขียนอยู่ในรูปแบบ (?<!a)b จะหมายถึงว่า จะ match กับ b ที่ไม่ได้นำหน้าด้วย a
ดังนั้น มาถึงตรงนี้แล้ว ถ้าเราอยากเขียน pattern ให้ match กับข้อความที่ไม่ได้ลงท้ายด้วยคำว่า end ล่ะ จะต้องเขียนยังไง…
เฉลย \w+(?<!end)$ ไงครับ (\w = ตัวอักษรใด ๆ ตามด้วย Negative Look Behind และปิดท้ายด้วย $ คือ สิ้นสุดประโยค)
สนุกมั๊ยครับ
งง มากมายครับ ผมไม่รู้ว่ามันเอาไปใช้ทำอะไรครับ ใช่ สคริ๊ป ที่ใช้ใส่เว็บไซต์หรือป่าว ช่วยแนะนำอีกหน่อยนะครับ ขอบคุณมาก
แล้วแต่จะเอาไปประยุกต์ใช้เลยครับ เช่น เราบอกว่า username ที่เว็บเราเปิดให้ใช้ตอนสมัครสมาชิก ห้ามขึ้นต้นด้วยตัวเลข อะไรแบบนี้ครับ
กำลังเขียน jquery ให้มันเช็คว่ากรอกได้เฉพาะ a-z งงมาก -*-
ใช้ regular expression แบบนี้เลยครับ
/^[a-z]+$/