2012-05-01 33 views
52

Đối với một số lý do hai regex hành động theo cùng một cách:thoát dot trong một phạm vi regex

"43\\gf..--.65".replace(/[^\d.-]/g, "");​ // 43..--.65 
"43\\gf..--.65".replace(/[^\d\.-]/g, "");​ // 43..--.65 

Demo

Trong regex đầu tiên tôi không thoát khỏi dấu chấm (.) trong khi trong lần thứ hai regex tôi làm (\.).

Sự khác biệt và lý do khiến chúng hoạt động như thế nào?

Trả lời

45

Do dấu chấm nằm trong lớp ký tự (dấu ngoặc vuông []).

Hãy xem http://www.regular-expressions.info/reference.html, nó nói (dưới phần lớp char):

Bất kỳ nhân vật ngoại trừ^-] \ thêm nhân vật đến các trận đấu thể cho lớp nhân vật.

+4

và dấu trừ ('-') cần được thoát chỉ khi nó ở giữa phạm vi? – gdoron

+0

Bởi vì nó làm việc tốt với tôi (actully không có vấn đề mà tôi đặt nó làm việc tốt.?!) – gdoron

+0

Nếu bạn muốn kết hợp dấu gạch nối, thêm nó ngay lập tức sau khi mở khung vuông, ví dụ: [-A-Z]. Nếu không thì dấu gạch ngang chỉ định phạm vi. Nó hoạt động trong trường hợp của bạn có lẽ chỉ vì bạn không chỉ định phạm vi trong regex, nhưng tôi khuyên bạn nên làm theo tham chiếu, trong trường hợp bạn sẽ thêm phạm vi sau này. – usoban

78

Toán tử dấu chấm . không cần phải được thoát bên trong lớp nhân vật [].

+17

Cảm ơn câu trả lời rõ ràng của bạn. Câu trả lời khác quá khó hiểu. – PolishHurricane

4

On this web page, tôi thấy rằng:

"Hãy nhớ rằng các dấu chấm không phải là một metacharater bên trong một lớp nhân vật, vì vậy chúng tôi không cần phải thoát khỏi nó với một dấu gạch chéo."

Vì vậy, tôi đoán thoát của nó là không cần thiết ...

17

Nếu bạn sử dụng JavaScript để kiểm tra Regex của bạn, hãy thử \\. thay vì \..

Hoạt động theo cùng một cách vì JS xóa dấu gạch chéo ngược đầu tiên.

+5

Bạn đã đọc câu trả lời chưa? – gdoron

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