ทำความเข้าใจกับการไม่สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็กใน Regex
อันที่จริงแล้ว การตั้งข้อสังเกต (regex) เป็นเครื่องมือที่ทรงพลังสำหรับการจับคู่รูปแบบและการจัดการสายข้อความ ความต้องการทั่วไปเมื่อทำงานกับ regex คือการไม่สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็กของตัวอักษรบางตัว ในขณะที่ยังคงให้ความสำคัญกับตัวพิมพ์ใหญ่-ตัวพิมพ์เล็กของตัวอื่น ในบล็อกโพสต์นี้ เราจะสำรวจวิธีการทำให้การไม่สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็กใน regex เป็นไปอย่างเฉพาะเจาะจง เพื่อให้มีความยืดหยุ่นมากขึ้นในการจับคู่รูปแบบของคุณ
ปัญหา
ลองนึกภาพว่าสายข้อความของคุณมีตัวพิมพ์ใหญ่-ตัวพิมพ์เล็กที่หลากหลาย เช่น:
fooFOOfOoFoOBARBARbarbarbAr
สมมติว่าคุณต้องการจับคู่ “foo” โดยไม่คำนึงถึงตัวพิมพ์ใหญ่-ตัวพิมพ์เล็ก แต่คุณต้องการจับคู่เฉพาะ “BAR” ในตัวพิมพ์ใหญ่ ความท้าทายคือการหาวิธีทำให้เพียงบางส่วนของรูปแบบ regex ของคุณไม่สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็ก ในขณะที่เก็บส่วนอื่น ๆ ไว้ให้สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็ก
วิธีการทั่วไปในการไม่สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็กใน Regex
บ่อยครั้ง รูปแบบ regex จะถูกทำให้ไม่สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็กโดยการปรับเปลี่ยนในระดับการใช้งานหรือระดับรูปแบบ อย่างไรก็ตาม ตามคำถามเริ่มต้นของเรา นี่ไม่ใช่สิ่งที่ต้องการเสมอไป
แนวทางแก้ไข: การเปลี่ยนโหมดแบบ Inline
การใช้ตัวปรับเปลี่ยนรูปแบบ
ในภาษา เช่น Perl คุณสามารถระบุตัวไม่สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็กสำหรับเพียงแค่บางส่วนของรูปแบบของคุณโดยใช้ตัวปรับเปลี่ยน (?i:)
วิธีการทำงานมีดังนี้:
- ตัวปรับเปลี่ยนแบบ Inline: แทรก
(?i:)
ก่อนส่วนของ regex ที่คุณต้องการทำให้ไม่สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็ก - ปิดตัวปรับเปลี่ยน: หากต้องการกลับไปให้มีความไวต่อพิมพ์ใหญ่-พิมพ์เล็ก คุณสามารถใช้ตัวปรับเปลี่ยน
(?-i)
ตัวอย่าง
สำหรับสายข้อความที่กำหนด เราสามารถสร้าง regex ได้ดังนี้:
(?i)foo*(?-i)|BAR
ในนิพจน์นี้:
(?i)
ทำให้ “foo” เป็นส่วนหนึ่งของ regex ที่ไม่สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็ก(?-i)
ทำให้มันกลับมาเป็นความไวต่อพิมพ์ใหญ่-พิมพ์เล็กสำหรับอะไรก็ตามที่ตามมากระทั่งตัวแบ่งท่อ (|) ที่บ่งบอกถึงการเริ่มต้นของรูปแบบ regex อื่น
การสนับสนุน Regex ข้ามภาษา
-
สนับสนุนตัวปรับเปลี่ยนแบบ Inline:
- Perl
- PHP
- .NET
-
ไม่สนับสนุนการเปลี่ยนแปลงแบบ Inline:
- JavaScript
- Python
ใน JavaScript และ Python ตัวปรับเปลี่ยนทั้งหมดจะนำไปใช้กับนิพจน์ทั้งหมด ซึ่งหมายความว่าไม่มีการสนับสนุนในการปิดโหมดหลังจากเปิดใช้งานแล้ว
การทดสอบ Regex ของคุณ
คุณสามารถทดสอบว่าเวอร์ชัน regex ของคุณจัดการกับตัวปรับเปลี่ยนโหมดได้อย่างไรโดยใช้ตัวอย่างง่ายๆ:
(?i)te(?-i)st
สิ่งนี้จะจับคู่:
- test
- TEst
แต่ ไม่:
- teST
- TEST
สรุป
การใช้การเปลี่ยนโหมดแบบ inline ใน regex สามารถเพิ่มพูนการจับคู่รูปแบบของคุณโดยมอบความยืดหยุ่นในความไวต่อพิมพ์ใหญ่-พิมพ์เล็ก ขณะที่บางภาษา เช่น Perl และ PHP อนุญาตให้มีการปรับเปลี่ยนเฉพาะเจาะจงเหล่านี้ ในขณะที่ภาษาอื่น ๆ เช่น JavaScript และ Python จะบังคับใช้ในลักษณะที่กว้างกว่า
หากต้องการข้อมูลที่ละเอียดเพิ่มเติมเกี่ยวกับตัวปรับเปลี่ยน regex ควรพิจารณาการตรวจสอบทรัพยากรเพิ่มเติม เช่น ข้อมูลเกี่ยวกับการตั้งข้อสังเกต
ด้วยแนวทางที่ถูกต้อง คุณสามารถสร้างรูปแบบ regex ที่ทรงพลังและแม่นยำในการจัดการความไวต่อพิมพ์ใหญ่-พิมพ์เล็กได้ตามต้องการ