การป้องกันอักขระพิเศษใน Regular Expressions ของ JavaScript
สมมติว่าเราต้องการให้อักขระพิเศษแทนตัวมันเอง วิธีการคือต้องป้องกันมันด้วยเครื่องหมายแบ็กสแลช ลองดูตัวอย่างกัน
ตัวอย่าง
ในตัวอย่างถัดไป ผู้เขียน Regular Expression ต้องการให้รูปแบบการค้นหาเป็นดังนี้: ตัวอักษร
'a', ตามด้วยเครื่องหมายบวก '+', ตามด้วยตัวอักษร 'x' อย่างไรก็ตาม ผู้เขียนโค้ด
ไม่ได้ป้องกันอักขระ '+' ดังนั้นรูปแบบการค้นหาจริงๆ จึงเป็นดังนี้:
ตัวอักษร 'a' หนึ่งครั้งหรือมากกว่า, ตามด้วยตัวอักษร 'x':
let str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');
ผลลัพธ์ที่ถูกบันทึกลงในตัวแปรจะเป็นดังนี้:
'a+x ! ! !'
ตัวอย่าง
และตอนนี้ผู้เขียนได้ป้องกันเครื่องหมายบวกด้วยแบ็กสแลชแล้ว ตอนนี้รูปแบบการค้นหาก็เป็นดังที่ต้องการ: ตัวอักษร 'a', ตามด้วยเครื่องหมายบวก
'+', ตามด้วยตัวอักษร 'x'
let str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');
ผลลัพธ์ที่ถูกบันทึกลงในตัวแปรจะเป็นดังนี้:
'! ax aax aaax'
ตัวอย่าง
ในตัวอย่างนี้ รูปแบบจะเป็นดังนี้: ตัวอักษร
'a', ตามด้วยจุด '.', ตามด้วยตัวอักษร 'x':
let str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');
ผลลัพธ์ที่ถูกบันทึกลงในตัวแปรจะเป็นดังนี้:
'! abx azx'
ตัวอย่าง
ในตัวอย่างถัดไป ผู้เขียนลืมป้องกันเครื่องหมายทับ และสตริงย่อยทั้งหมดตรงกันกับ Regular Expression เนื่องจากจุดที่ไม่ได้ป้องกันหมายถึงอักขระใดๆ ก็ได้:
let str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');
ผลลัพธ์ที่ถูกบันทึกลงในตัวแปรจะเป็นดังนี้:
'! ! !'
หมายเหตุ
โปรดสังเกตว่าถ้าคุณลืมแบ็กสแลชสำหรับจุด (เมื่อมันควรจะหมายถึงตัวมันเอง) - คุณอาจจะไม่สังเกตเห็นความผิดพลาดนี้:
'a.x'.replace(/a.x/g, '!'); // ส่งคืน '!' ตามที่เราต้องการ
จากภายนอก ดูเหมือนจะทำงานถูกต้อง (เนื่องจากจุดหมายถึงอักขระใดๆ ก็ได้ รวมถึงจุดธรรมดา '.' ด้วย) แต่ถ้าเราเปลี่ยนสตริง
ที่กำลังถูกแทนที่ - เราจะเห็นข้อผิดพลาดของเรา:
'a.x abx azx'.replace(/a.x/g, '!'); // ส่งคืน '! ! !' แต่คาดหวัง '! abx azx'
รายการอักขระพิเศษและอักขระธรรมดา
หากคุณป้องกันอักขระธรรมดา - ไม่มีอะไรเลวร้ายเกิดขึ้น - มันจะยังคงหมายถึงตัวมันเอง ข้อยกเว้นคือตัวเลข คุณไม่สามารถป้องกันพวกมันได้
มักจะมีข้อสงสัยว่าอักขระนี้เป็นอักขระพิเศษหรือไม่ บางคนถึงขั้นป้องกันอักขระที่น่าสงสัยทั้งหมดในทันที อย่างไรก็ตาม นี่เป็นวิธีปฏิบัติที่ไม่ดี (ทำให้ Regular Expression รกไปด้วยแบ็กสแลช)
อักขระต่อไปนี้เป็นอักขระพิเศษ: $ ^ . * + ? \
/ {} [] () |
อักขระต่อไปนี้ไม่ใช่อักขระพิเศษ: @ : , ' " ;
- _ = < > % # ~ `& !
ปัญหาเชิงปฏิบัติ
กำหนดสตริง:
let str = 'a.a aba aea';
เขียน Regular Expression ที่จะค้นหาสตริง
'a.a' โดยไม่ครอบคลุมสตริงอื่นๆ
กำหนดสตริง:
let str = '2+3 223 2223';
เขียน Regular Expression ที่จะค้นหาสตริง
'2+3' โดยไม่ครอบคลุมสตริงอื่นๆ
กำหนดสตริง:
let str = '23 2+3 2++3 2+++3 345 567';
เขียน Regular Expression ที่จะค้นหาสตริง
'2+3', '2++3', '2+++3',
โดยไม่ครอบคลุมสตริงอื่นๆ (+ อาจจะมีได้หลายตัว)
กำหนดสตริง:
let str = '23 2+3 2++3 2+++3 445 677';
เขียน Regular Expression ที่จะค้นหาสตริง
'23', '2+3', '2++3',
'2+++3' โดยไม่ครอบคลุมสตริงอื่นๆ
กำหนดสตริง:
let str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';
เขียน Regular Expression ที่จะค้นหาสตริง
'*q+', '*qq+', '*qqq+',
โดยไม่ครอบคลุมสตริงอื่นๆ
กำหนดสตริง:
let str = '[abc] {abc} abc (abc) [abc]';
เขียน Regular Expression ที่จะค้นหาสตริง
ที่อยู่ในวงเล็บเหลี่ยมและแทนที่มันด้วย '!'