Hướng dẫn what characters need to be escaped javascript? - những ký tự nào cần được thoát khỏi javascript?

Câu trả lời ở đây đã trở nên phức tạp hơn một chút với việc giới thiệu các biểu thức chính quy Unicode trong JavaScript (nghĩa là các biểu thức thông thường được xây dựng bằng cờ

/(?\w+)/
5). Đặc biệt:

  • Các biểu thức thường xuyên không phải là không thể hỗ trợ "nhận dạng" thoát khỏi; Đó là, nếu một nhân vật không có một cách giải thích đặc biệt trong mẫu biểu thức chính quy, thì hãy thoát thì nó không làm gì cả. Điều này ngụ ý rằng

    /(?\w+)/
    
    6 và
    /(?\w+)/
    
    7 sẽ khớp một cách giống hệt nhau.

  • Các biểu thức chính quy Unicode nghiêm ngặt hơn - cố gắng thoát khỏi một ký tự không được coi là "đặc biệt" là một lỗi. Ví dụ,

    /(?\w+)/
    
    8 không phải là một biểu thức chính quy hợp lệ.

Tập hợp các ký tự được giải thích đặc biệt có thể được chia rẽ từ tiêu chuẩn ECMAScript; Ví dụ: với Ecmascript 2021, https://262.ecma-international.org/12.0/#sec-patterns, chúng ta thấy các ký tự "cú pháp" sau đây:

SyntaxCharacter :: one of
    ^ $ \ . * + ? ( ) [ ] { } |

Cụ thể, trái ngược với các câu trả lời khác, lưu ý rằng

/(?\w+)/
9,
> /\ /\
0,
> /\ /\
1,
> /\ /\
2 và
> /\ /\
3 không được coi là ký tự cú pháp. Thay vào đó, những nhân vật này chỉ có thể có một cách giải thích đặc biệt trong các bối cảnh cụ thể.

Ví dụ, các ký tự

> /\ /\
0 và
> /\ /\
1 chỉ có một cách giải thích đặc biệt khi được sử dụng làm tên nhóm bắt giữ; ví dụ. Như trong

/(?\w+)/

Và bởi vì

> /\ /\
0 và
> /\ /\
1 không được coi là ký tự cú pháp, việc thoát chúng là một lỗi trong các biểu thức chính quy Unicode.

> /\ /\

Ngoài ra, ký tự

> /\ /\
3 chỉ được giải thích đặc biệt trong một lớp ký tự, khi được sử dụng để diễn đạt một phạm vi ký tự, như trong ví dụ:

/[a-z]/

Nó có giá trị khi thoát khỏi một

> /\ /\
3 trong một lớp ký tự, nhưng không phải bên ngoài một lớp ký tự, cho các biểu thức chính quy Unicode.

> /\-/
/\-/

> /\-/u
Uncaught SyntaxError: Invalid regular expression: /\-/: Invalid escape

> /[-]/
/[-]/

> /[\-]/u
/[\-]/u

Đối với một biểu thức thông thường được xây dựng bằng cú pháp

/[a-z]/
0 (trái ngược với
/[a-z]/
1), dấu gạch chéo bên trong (
/[a-z]/
2) sẽ cần phải được thoát ra Điểm đánh dấu cuối cho một mẫu so với một
/[a-z]/
2 theo nghĩa đen trong mẫu.

> /\//.test("/")
true

> new RegExp("/").test("/")
true

Cuối cùng, nếu mục tiêu của bạn là thoát khỏi các nhân vật để chúng không được giải thích đặc biệt trong một biểu thức thông thường, thì chỉ đủ để thoát khỏi các ký tự cú pháp. Ví dụ: nếu chúng tôi muốn khớp với chuỗi theo nghĩa đen

/[a-z]/
5, chúng tôi có thể sử dụng:

> /\(\?:hello\)/.test("(?:hello)")
true

> /\(\?:hello\)/u.test("(?:hello)")
true

Lưu ý rằng ký tự

> /\ /\
2 không bị thoát ra. Có vẻ như cần phải thoát khỏi ký tự
> /\ /\
2 vì nó có một cách giải thích đặc biệt trong mẫu
/[a-z]/
5, nhưng vì nó không được coi là ký tự cú pháp, thoát khỏi nó là không cần thiết. .


Đoạn mã trên đã được kiểm tra với:

$ node -v
v16.14.0

$ node -p process.versions.v8
9.4.146.24-node.20

Như chúng tôi đã thấy, một dấu gạch chéo ngược

> /\-/
/\-/

> /\-/u
Uncaught SyntaxError: Invalid regular expression: /\-/: Invalid escape

> /[-]/
/[-]/

> /[\-]/u
/[\-]/u
2 được sử dụng để biểu thị các lớp ký tự, ví dụ:
> /\-/
/\-/

> /\-/u
Uncaught SyntaxError: Invalid regular expression: /\-/: Invalid escape

> /[-]/
/[-]/

> /[\-]/u
/[\-]/u
3. Vì vậy, nó là một nhân vật đặc biệt trong RegEXP (giống như trong các chuỗi thông thường).

Cũng có những nhân vật đặc biệt khác, có ý nghĩa đặc biệt trong RegEXP, chẳng hạn như

> /\-/
/\-/

> /\-/u
Uncaught SyntaxError: Invalid regular expression: /\-/: Invalid escape

> /[-]/
/[-]/

> /[\-]/u
/[\-]/u
4. Chúng được sử dụng để thực hiện các tìm kiếm mạnh mẽ hơn.

Don Tiết cố gắng ghi nhớ danh sách - chẳng mấy chốc chúng tôi sẽ đối phó với từng người trong số họ và bạn sẽ tự động biết họ bằng trái tim.

Trốn thoát

Hãy nói rằng chúng tôi muốn tìm một dấu chấm theo nghĩa đen. Không phải là bất kỳ nhân vật nào, mà chỉ là một dấu chấm.

Để sử dụng một ký tự đặc biệt như một nhân vật thông thường, hãy dành cho nó bằng một dấu gạch chéo ngược:

> /\-/
/\-/

> /\-/u
Uncaught SyntaxError: Invalid regular expression: /\-/: Invalid escape

> /[-]/
/[-]/

> /[\-]/u
/[\-]/u
5.

Đó cũng là người được gọi là Escaping một nhân vật.

Ví dụ:

alert( "Chapter 5.1".match(/\d\.\d/) ); // 5.1 (match!)
alert( "Chapter 511".match(/\d\.\d/) ); // null (looking for a real dot \.)

Điểm dừng cũng là những nhân vật đặc biệt, vì vậy nếu chúng ta muốn chúng, chúng ta nên sử dụng

> /\-/
/\-/

> /\-/u
Uncaught SyntaxError: Invalid regular expression: /\-/: Invalid escape

> /[-]/
/[-]/

> /[\-]/u
/[\-]/u
6. Ví dụ dưới đây tìm kiếm một chuỗi
> /\-/
/\-/

> /\-/u
Uncaught SyntaxError: Invalid regular expression: /\-/: Invalid escape

> /[-]/
/[-]/

> /[\-]/u
/[\-]/u
7:

alert( "function g()".match(/g\(\)/) ); // "g()"

Nếu chúng tôi đang tìm kiếm một dấu gạch chéo ngược

> /\-/
/\-/

> /\-/u
Uncaught SyntaxError: Invalid regular expression: /\-/: Invalid escape

> /[-]/
/[-]/

> /[\-]/u
/[\-]/u
2, thì đó là một nhân vật đặc biệt trong cả hai chuỗi thông thường và regexps, vì vậy chúng tôi nên nhân đôi nó.

/(?\w+)/
0

Một chém

Một biểu tượng chém

> /\-/
/\-/

> /\-/u
Uncaught SyntaxError: Invalid regular expression: /\-/: Invalid escape

> /[-]/
/[-]/

> /[\-]/u
/[\-]/u
9 không phải là một nhân vật đặc biệt, nhưng trong JavaScript, nó được sử dụng để mở và đóng RegEXP:
> /\//.test("/")
true

> new RegExp("/").test("/")
true
0, vì vậy chúng ta cũng nên thoát khỏi nó.

Ở đây, những gì một tìm kiếm cho một chém

> /\-/
/\-/

> /\-/u
Uncaught SyntaxError: Invalid regular expression: /\-/: Invalid escape

> /[-]/
/[-]/

> /[\-]/u
/[\-]/u
9 trông giống như:

/(?\w+)/
1

Mặt khác, nếu chúng tôi không sử dụng

> /\//.test("/")
true

> new RegExp("/").test("/")
true
2, nhưng tạo ra một regexp bằng cách sử dụng
> /\//.test("/")
true

> new RegExp("/").test("/")
true
3, thì chúng tôi không cần phải thoát khỏi nó:

/(?\w+)/
2

Regexp mới

Nếu chúng ta đang tạo ra một biểu thức chính quy với

> /\//.test("/")
true

> new RegExp("/").test("/")
true
3, thì chúng ta không phải trốn thoát
/[a-z]/
2, nhưng cần phải thực hiện một số trốn thoát khác.

Ví dụ, hãy xem xét điều này:

/(?\w+)/
3

Tìm kiếm tương tự trong một trong những ví dụ trước đã làm việc với

> /\//.test("/")
true

> new RegExp("/").test("/")
true
6, nhưng
> /\//.test("/")
true

> new RegExp("/").test("/")
true
7 không hoạt động, tại sao?

Lý do là các dấu gạch chéo ngược được tiêu thụ bởi một chuỗi. Như chúng ta có thể nhớ lại, các chuỗi thông thường có các nhân vật đặc biệt của riêng họ, chẳng hạn như

> /\//.test("/")
true

> new RegExp("/").test("/")
true
8 và một dấu gạch chéo ngược được sử dụng để trốn thoát.

Ở đây, cách thức, cách thức của \ d.

Chuỗi trích dẫn của người Hồi giáo tiêu thụ dấu vết chéo ngược và tự giải thích chúng, ví dụ:

  • > /\//.test("/")
    true
    
    > new RegExp("/").test("/")
    true
    
    8 - trở thành một nhân vật mới,
  • > /\(\?:hello\)/.test("(?:hello)")
    true
    
    > /\(\?:hello\)/u.test("(?:hello)")
    true
    
    0 - trở thành ký tự Unicode với mã đó,
  • Và khi không có ý nghĩa đặc biệt: như
    > /\-/
    /\-/
    
    > /\-/u
    Uncaught SyntaxError: Invalid regular expression: /\-/: Invalid escape
    
    > /[-]/
    /[-]/
    
    > /[\-]/u
    /[\-]/u
    
    3 hoặc
    > /\(\?:hello\)/.test("(?:hello)")
    true
    
    > /\(\?:hello\)/u.test("(?:hello)")
    true
    
    2, thì dấu gạch chéo ngược được loại bỏ đơn giản.

Vì vậy,

> /\//.test("/")
true

> new RegExp("/").test("/")
true
3 nhận được một chuỗi mà không có dấu gạch chéo ngược. Đó là lý do tại sao việc tìm kiếm không hoạt động!

Để sửa nó, chúng ta cần tăng gấp đôi các dấu gạch chéo ngược, vì trích dẫn chuỗi biến

> /\(\?:hello\)/.test("(?:hello)")
true

> /\(\?:hello\)/u.test("(?:hello)")
true
4 thành
> /\-/
/\-/

> /\-/u
Uncaught SyntaxError: Invalid regular expression: /\-/: Invalid escape

> /[-]/
/[-]/

> /[\-]/u
/[\-]/u
2:

/(?\w+)/
4

Bản tóm tắt

  • Để tìm kiếm các nhân vật đặc biệt
    > /\(\?:hello\)/.test("(?:hello)")
    true
    
    > /\(\?:hello\)/u.test("(?:hello)")
    true
    
    6 theo nghĩa đen, chúng ta cần phải chuẩn bị cho họ bằng một dấu gạch chéo ngược
    > /\-/
    /\-/
    
    > /\-/u
    Uncaught SyntaxError: Invalid regular expression: /\-/: Invalid escape
    
    > /[-]/
    /[-]/
    
    > /[\-]/u
    /[\-]/u
    
    2 (thoát khỏi chúng).
  • Chúng ta cũng cần thoát
    /[a-z]/
    
    2 nếu chúng ta ở bên trong
    > /\//.test("/")
    true
    
    > new RegExp("/").test("/")
    true
    
    2 (nhưng không phải bên trong
    > /\//.test("/")
    true
    
    > new RegExp("/").test("/")
    true
    
    3).
  • Khi chuyển một chuỗi cho
    > /\//.test("/")
    true
    
    > new RegExp("/").test("/")
    true
    
    3, chúng ta cần tăng gấp đôi các dấu gạch chéo ngược
    > /\(\?:hello\)/.test("(?:hello)")
    true
    
    > /\(\?:hello\)/u.test("(?:hello)")
    true
    
    4, gây ra trích dẫn chuỗi tiêu thụ một trong số chúng.

Những ký tự URL nào cần được thoát ra?

Sử dụng các ký tự thoát URL khi tạo các URL có chứa khoảng trắng hoặc các ký tự đặc biệt khác.when creating URLs that contain spaces or other special characters.

Những nhân vật nào nên được trốn thoát trong JSON?

Trong JSON, các ký tự duy nhất bạn phải trốn thoát là \, "và mã kiểm soát.\, ", and control codes.

Những nhân vật nào cần phải được thoát khỏi grep?

Bất cứ khi nào bạn sử dụng biểu thức thông thường của grep tại dấu nhắc lệnh, hãy bao quanh nó bằng trích dẫn hoặc thoát khỏi metacharacters (như &!.* $? Và \) với một dấu gạch chéo ngược (\).& ! . * $ ? and \ ) with a backslash ( \ ).

Những nhân vật nào phải được thoát ra khỏi Regex?

Regex nhận ra các trình tự thoát phổ biến như \ n cho Newline, \ t cho tab, \ r để quay lại vận chuyển, \ nnn cho số octal lên tới 3 chữ số, \ xhh cho mã hex hai chữ số, \ uhhhh cho mộtUnicode 4 chữ số, \ uhhhhhhhhh cho một unicode 8 chữ số.\n for newline, \t for tab, \r for carriage-return, \nnn for a up to 3-digit octal number, \xhh for a two-digit hex code, \uhhhh for a 4-digit Unicode, \uhhhhhhhh for a 8-digit Unicode.