Skip to content


Regular Expression : ไม่เริ่มต้นด้วย… เขียนยังไงเนี่ย

ใน 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 และปิดท้ายด้วย $ คือ สิ้นสุดประโยค)

สนุกมั๊ยครับ ;)

Share

Posted in Regular Expression.

Tagged with , , , , , .


4 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. cyberboy2526 says

    งง มากมายครับ ผมไม่รู้ว่ามันเอาไปใช้ทำอะไรครับ ใช่ สคริ๊ป ที่ใช้ใส่เว็บไซต์หรือป่าว ช่วยแนะนำอีกหน่อยนะครับ ขอบคุณมาก

  2. chonla says

    แล้วแต่จะเอาไปประยุกต์ใช้เลยครับ เช่น เราบอกว่า username ที่เว็บเราเปิดให้ใช้ตอนสมัครสมาชิก ห้ามขึ้นต้นด้วยตัวเลข อะไรแบบนี้ครับ

  3. เว็บฝากรูป says

    กำลังเขียน jquery ให้มันเช็คว่ากรอกได้เฉพาะ a-z งงมาก -*-

  4. chonla says

    ใช้ regular expression แบบนี้เลยครับ

    /^[a-z]+$/



Some HTML is OK

or, reply to this post via trackback.

*