ทำความเข้าใจกับการไม่สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็กใน Regex

อันที่จริงแล้ว การตั้งข้อสังเกต (regex) เป็นเครื่องมือที่ทรงพลังสำหรับการจับคู่รูปแบบและการจัดการสายข้อความ ความต้องการทั่วไปเมื่อทำงานกับ regex คือการไม่สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็กของตัวอักษรบางตัว ในขณะที่ยังคงให้ความสำคัญกับตัวพิมพ์ใหญ่-ตัวพิมพ์เล็กของตัวอื่น ในบล็อกโพสต์นี้ เราจะสำรวจวิธีการทำให้การไม่สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็กใน regex เป็นไปอย่างเฉพาะเจาะจง เพื่อให้มีความยืดหยุ่นมากขึ้นในการจับคู่รูปแบบของคุณ

ปัญหา

ลองนึกภาพว่าสายข้อความของคุณมีตัวพิมพ์ใหญ่-ตัวพิมพ์เล็กที่หลากหลาย เช่น:

fooFOOfOoFoOBARBARbarbarbAr

สมมติว่าคุณต้องการจับคู่ “foo” โดยไม่คำนึงถึงตัวพิมพ์ใหญ่-ตัวพิมพ์เล็ก แต่คุณต้องการจับคู่เฉพาะ “BAR” ในตัวพิมพ์ใหญ่ ความท้าทายคือการหาวิธีทำให้เพียงบางส่วนของรูปแบบ regex ของคุณไม่สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็ก ในขณะที่เก็บส่วนอื่น ๆ ไว้ให้สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็ก

วิธีการทั่วไปในการไม่สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็กใน Regex

บ่อยครั้ง รูปแบบ regex จะถูกทำให้ไม่สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็กโดยการปรับเปลี่ยนในระดับการใช้งานหรือระดับรูปแบบ อย่างไรก็ตาม ตามคำถามเริ่มต้นของเรา นี่ไม่ใช่สิ่งที่ต้องการเสมอไป

แนวทางแก้ไข: การเปลี่ยนโหมดแบบ Inline

การใช้ตัวปรับเปลี่ยนรูปแบบ

ในภาษา เช่น Perl คุณสามารถระบุตัวไม่สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็กสำหรับเพียงแค่บางส่วนของรูปแบบของคุณโดยใช้ตัวปรับเปลี่ยน (?i:) วิธีการทำงานมีดังนี้:

  1. ตัวปรับเปลี่ยนแบบ Inline: แทรก (?i:) ก่อนส่วนของ regex ที่คุณต้องการทำให้ไม่สนใจตัวพิมพ์ใหญ่-ตัวพิมพ์เล็ก
  2. ปิดตัวปรับเปลี่ยน: หากต้องการกลับไปให้มีความไวต่อพิมพ์ใหญ่-พิมพ์เล็ก คุณสามารถใช้ตัวปรับเปลี่ยน (?-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 ที่ทรงพลังและแม่นยำในการจัดการความไวต่อพิมพ์ใหญ่-พิมพ์เล็กได้ตามต้องการ