การป้องกันอักขระพิเศษใน Regular Expressions ของ JavaScript

สมมติว่าเราต้องการให้อักขระพิเศษแทนตัวมันเอง วิธีการคือต้องป้องกันมันด้วยเครื่องหมายแบ็กสแลช ลองดูตัวอย่างกัน

ตัวอย่าง

ในตัวอย่างถัดไป ผู้เขียน Regular Expression ต้องการให้รูปแบบการค้นหาเป็นดังนี้: ตัวอักษร 'a', ตามด้วยเครื่องหมายบวก '+', ตามด้วยตัวอักษร 'x' อย่างไรก็ตาม ผู้เขียนโค้ด ไม่ได้ป้องกันอักขระ '+' ดังนั้นรูปแบบการค้นหาจริงๆ จึงเป็นดังนี้: ตัวอักษร 'a' หนึ่งครั้งหรือมากกว่า, ตามด้วยตัวอักษร 'x':

javascriptlet str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');

ผลลัพธ์ที่ถูกบันทึกลงในตัวแปรจะเป็นดังนี้:

javascript'a+x ! ! !'

ตัวอย่าง

และตอนนี้ผู้เขียนได้ป้องกันเครื่องหมายบวกด้วยแบ็กสแลชแล้ว ตอนนี้รูปแบบการค้นหาก็เป็นดังที่ต้องการ: ตัวอักษร 'a', ตามด้วยเครื่องหมายบวก '+', ตามด้วยตัวอักษร 'x'

javascriptlet str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');

ผลลัพธ์ที่ถูกบันทึกลงในตัวแปรจะเป็นดังนี้:

javascript'! ax aax aaax'

ตัวอย่าง

ในตัวอย่างนี้ รูปแบบจะเป็นดังนี้: ตัวอักษร 'a', ตามด้วยจุด '.', ตามด้วยตัวอักษร 'x':

javascriptlet str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');

ผลลัพธ์ที่ถูกบันทึกลงในตัวแปรจะเป็นดังนี้:

javascript'! abx azx'

ตัวอย่าง

ในตัวอย่างถัดไป ผู้เขียนลืมป้องกันเครื่องหมายทับ และสตริงย่อยทั้งหมดตรงกันกับ Regular Expression เนื่องจากจุดที่ไม่ได้ป้องกันหมายถึงอักขระใดๆ ก็ได้:

javascriptlet str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');

ผลลัพธ์ที่ถูกบันทึกลงในตัวแปรจะเป็นดังนี้:

javascript'! ! !'

หมายเหตุ

โปรดสังเกตว่าถ้าคุณลืมแบ็กสแลชสำหรับจุด (เมื่อมันควรจะหมายถึงตัวมันเอง) - คุณอาจจะไม่สังเกตเห็นความผิดพลาดนี้:

javascript'a.x'.replace(/a.x/g, '!'); // ส่งคืน '!' ตามที่เราต้องการ

จากภายนอก ดูเหมือนจะทำงานถูกต้อง (เนื่องจากจุดหมายถึงอักขระใดๆ ก็ได้ รวมถึงจุดธรรมดา '.' ด้วย) แต่ถ้าเราเปลี่ยนสตริง ที่กำลังถูกแทนที่ - เราจะเห็นข้อผิดพลาดของเรา:

javascript'a.x abx azx'.replace(/a.x/g, '!'); // ส่งคืน '! ! !' แต่คาดหวัง '! abx azx'

รายการอักขระพิเศษและอักขระธรรมดา

หากคุณป้องกันอักขระธรรมดา - ไม่มีอะไรเลวร้ายเกิดขึ้น - มันจะยังคงหมายถึงตัวมันเอง ข้อยกเว้นคือตัวเลข คุณไม่สามารถป้องกันพวกมันได้

มักจะมีข้อสงสัยว่าอักขระนี้เป็นอักขระพิเศษหรือไม่ บางคนถึงขั้นป้องกันอักขระที่น่าสงสัยทั้งหมดในทันที อย่างไรก็ตาม นี่เป็นวิธีปฏิบัติที่ไม่ดี (ทำให้ Regular Expression รกไปด้วยแบ็กสแลช)

อักขระต่อไปนี้เป็นอักขระพิเศษ: $ ^ . * + ? \ / {} [] () |

อักขระต่อไปนี้ไม่ใช่อักขระพิเศษ: @ : , ' " ; - _ = < > % # ~ `& !

ปัญหาเชิงปฏิบัติ

Задание 1

กำหนดสตริง:

javascriptlet str = 'a.a aba aea';

เขียน Regular Expression ที่จะค้นหาสตริง 'a.a' โดยไม่ครอบคลุมสตริงอื่นๆ

Задание 2

กำหนดสตริง:

javascriptlet str = '2+3 223 2223';

เขียน Regular Expression ที่จะค้นหาสตริง '2+3' โดยไม่ครอบคลุมสตริงอื่นๆ

Задание 3

กำหนดสตริง:

javascriptlet str = '23 2+3 2++3 2+++3 345 567';

เขียน Regular Expression ที่จะค้นหาสตริง '2+3', '2++3', '2+++3', โดยไม่ครอบคลุมสตริงอื่นๆ (+ อาจจะมีได้หลายตัว)

Задание 4

กำหนดสตริง:

javascriptlet str = '23 2+3 2++3 2+++3 445 677';

เขียน Regular Expression ที่จะค้นหาสตริง '23', '2+3', '2++3', '2+++3' โดยไม่ครอบคลุมสตริงอื่นๆ

Задание 5

กำหนดสตริง:

javascriptlet str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';

เขียน Regular Expression ที่จะค้นหาสตริง '*q+', '*qq+', '*qqq+', โดยไม่ครอบคลุมสตริงอื่นๆ

Задание 6

กำหนดสตริง:

javascriptlet str = '[abc] {abc} abc (abc) [abc]';

เขียน Regular Expression ที่จะค้นหาสตริง ที่อยู่ในวงเล็บเหลี่ยมและแทนที่มันด้วย '!'