Ký tự thoát đặc biệt trong biểu thức chính quy JavaScript
Giả sử chúng ta muốn làm sao cho ký tự đặc biệt biểu thị chính nó. Để làm điều này nó cần được thoát bằng dấu gạch chéo ngược. Hãy xem qua các ví dụ.
Ví dụ
Trong ví dụ sau, tác giả của biểu thức chính quy muốn
mẫu tìm kiếm trông như thế này: chữ cái
'a', sau đó dấu cộng '+', sau đó
chữ cái 'x'. Tuy nhiên, tác giả mã
không thoát ký tự '+' và do đó
mẫu tìm kiếm thực sự lại trông như thế này:
chữ cái 'a' một hoặc nhiều lần, sau đó
chữ cái 'x':
let str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');
Kết quả, biến sẽ ghi lại như sau:
'a+x ! ! !'
Ví dụ
Và bây giờ tác giả đã thoát dấu cộng bằng dấu gạch chéo ngược.
Bây giờ mẫu tìm kiếm trông như
chúng ta mong muốn: chữ cái 'a', sau đó dấu cộng
'+', sau đó chữ cái 'x'.
let str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');
Kết quả, biến sẽ ghi lại như sau:
'! ax aax aaax'
Ví dụ
Trong ví dụ này, mẫu trông như thế này: chữ cái
'a', sau đó dấu chấm '.', sau đó
chữ cái 'x':
let str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');
Kết quả, biến sẽ ghi lại như sau:
'! abx azx'
Ví dụ
Trong ví dụ sau, tác giả quên thoát dấu chấm và tất cả các chuỗi con đều khớp với biểu thức chính quy, vì dấu chấm không được thoát biểu thị bất kỳ ký tự nào:
let str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');
Kết quả, biến sẽ ghi lại như sau:
'! ! !'
Lưu ý
Hãy chú ý rằng nếu bạn quên dấu gạch chéo ngược cho dấu chấm (khi nó nên biểu thị chính nó) - điều này thậm chí có thể không được chú ý:
'a.x'.replace(/a.x/g, '!'); // trả về '!', như chúng ta muốn
Về mặt hình thức thì hoạt động đúng (vì dấu chấm
biểu thị bất kỳ ký tự nào, kể cả dấu chấm thông thường
'.'). Nhưng nếu thay đổi chuỗi,
trong đó thực hiện thay thế - chúng ta sẽ thấy
lỗi của mình:
'a.x abx azx'.replace(/a.x/g, '!'); // trả về '! ! !', trong khi mong đợi '! abx azx'
Danh sách ký tự đặc biệt và thông thường
Nếu thoát một ký tự thông thường - không có gì xấu xảy ra - nó vẫn sẽ biểu thị chính nó. Ngoại lệ - chữ số, không thể thoát chúng.
Thường nảy sinh nghi ngờ, liệu ký tự này có phải là đặc biệt hay không. Một số đi đến mức thoát tất cả các ký tự đáng ngờ một cách liên tục. Tuy nhiên, đây là thực hành không tốt (làm rối biểu thức chính quy với các dấu gạch chéo ngược).
Là ký tự đặc biệt: $ ^ . * + ? \
/ {} [] () |
Không phải ký tự đặc biệt: @ : , ' " ;
- _ = < > % # ~ `& !
Bài tập thực hành
Cho chuỗi:
let str = 'a.a aba aea';
Viết biểu thức chính quy tìm chuỗi
'a.a', không lấy các chuỗi còn lại.
Cho chuỗi:
let str = '2+3 223 2223';
Viết biểu thức chính quy tìm chuỗi
'2+3', không lấy các chuỗi còn lại.
Cho chuỗi:
let str = '23 2+3 2++3 2+++3 345 567';
Viết biểu thức chính quy tìm các chuỗi
'2+3', '2++3', '2+++3',
không lấy các chuỗi còn lại (+ có thể có bất kỳ
số lượng).
Cho chuỗi:
let str = '23 2+3 2++3 2+++3 445 677';
Viết biểu thức chính quy tìm các chuỗi
'23', '2+3', '2++3',
'2+++3', không lấy các chuỗi còn lại.
Cho chuỗi:
let str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';
Viết biểu thức chính quy tìm các chuỗi
'*q+', '*qq+', '*qqq+',
không lấy các chuỗi còn lại.
Cho chuỗi:
let str = '[abc] {abc} abc (abc) [abc]';
Viết biểu thức chính quy tìm các chuỗi
trong dấu ngoặc vuông và thay thế chúng bằng '!'.