2010-03-02 39 views
10

Tôi gặp sự cố khi giải quyết vấn đề này. Trong một số mã, tôi thấy/[ []/làm gì trong JavaScript?

name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); 

/[\[]/ có vẻ là 1 tham số. Các biểu tượng làm gì? Dường như nó thay thế [] bằng \[\] nhưng những gì cụ thể không /[\[]/ làm gì?

+2

Câu hỏi thực sự là tại sao họ sử dụng một lớp nhân vật để khớp với một '[' – friedo

+0

@friedo tôi đoán là họ không biết cái gì '[... ] 'là lớp nhân vật –

Trả lời

11

Cú pháp /…/literal regular expression syntax. Và cụm từ thông dụng [\[] mô tả một lớp nhân vật ([…]) chỉ có ký tự là [). Vì vậy, /[\[]/ là cụm từ thông dụng mô tả một đơn [.

Nhưng kể từ khi lá cờ toàn cầu không được thiết lập (như vậy chỉ là trận đấu đầu tiên sẽ được thay thế), toàn bộ điều có thể được thay thế bằng này (có lẽ dễ dàng hơn để đọc):

name.replace("[", "\\[").replace("]","\\]") 

Nhưng nếu tất cả các trận đấu nên được thay thế, tôi có thể sử dụng điều này:

name.replace(/([[\]])/g, "\\$1") 
10

Đó là cụm từ thông dụng khớp với ký tự trong ngoặc vuông bên trái.

Đó là một cách kỳ lạ để thực hiện điều đó; tổng thể có vẻ như mã đang cố gắng đặt dấu gạch chéo ngược trước dấu ngoặc vuông trong chuỗi, bạn cũng có thể làm như sau:

var s2 = s1.replace(/\[/g, '\\[').replace(/]/g, '\\]'); 

Tôi nghĩ vậy.

3

/[[]/xác định phạm vi ký tự chỉ bao gồm ký tự ']' (thoát), bạn đã sửa đúng [] bằng [].

+0

hrm ... thay thế [và] bằng phiên bản thoát của chúng s –

2

[] có trong chính regex được sử dụng để biểu thị tập hợp các ký tự trùng khớp. Nếu bạn muốn đại diện cho thực tế [ hoặc ] trong regex, thì bạn cần phải thoát khỏi nó bằng \, do đó [\[][\]]. Các hàng đầu và theo sau / chỉ là một phần của cú pháp JS tiêu chuẩn để biểu thị một mẫu regex.

Sau cùng, nó thay thế [ bởi \[ và sau đó thay thế ] bởi \].

+0

Tôi đoán bên trong [] a [không phải là một meta char. [[] là một lớp học hợp lệ chỉ phù hợp với [ – codaddict

Các vấn đề liên quan