2011-11-01 40 views
17

Gần đây chúng tôi đã có một lỗi, sau khi một nhà phát triển đồng nghiệp thay đổi chữ RegExp thành lời gọi hàm tạo và tôi đã tự hỏi tại sao có bất kỳ sự khác biệt nào. Mã chính xác làSự khác biệt giữa Javascript regexp literal và constructor

var parts = new RegExp("/rt:([^@]+)@(\d+)/").exec(tag); 

vs bản gốc của

var parts = /rt:([^@]+)@(\d+)/.exec(tag); 

Khi tag được, ví dụ rt:[email protected], là người đầu tiên (buggy) gọi trả null, trong khi cái thứ hai trả ["rt:[email protected]", "60C1C036-42FA-4073-B10B-1969BD2358FB", "00000000077"]

Không cần phải nói, tôi đã hoàn nguyên sự thay đổi, nhưng tôi muốn biết tại sao lại có sự khác biệt như vậy ở nơi đầu tiên.

Trả lời

33

Có hai vấn đề:

Các /không phần của biểu thức. Chúng là delimiters, đánh dấu một chữ regex. Chúng phải được xóa nếu bạn sử dụng RegExp, nếu không chúng sẽ khớp với dấu gạch chéo theo nghĩa đen.

Thứ hai, dấu gạch chéo ngược là ký tự thoát trong chuỗi ký tự. Để tạo một chữ số \ cho cụm từ, bạn phải thoát nó trong chuỗi.

Như vậy, tương đương sẽ là:

new RegExp("rt:([^@]+)@(\\d+)") 

Đặc biệt là thoát làm cho biểu hiện khó khăn hơn một chút để viết nếu bạn muốn sử dụng RegExp. Nó thực sự chỉ cần thiết nếu bạn muốn tạo biểu thức động, nghĩa là, nếu bạn muốn bao gồm văn bản được lưu trữ trong một biến chẳng hạn. Nếu bạn có biểu thức cố định, một chữ số /.../ sẽ dễ viết hơn và ngắn gọn hơn.

+0

Câu trả lời hay, hãy nghĩ tôi sẽ xóa tên của tôi! Điều gì sẽ xảy ra nếu bạn cần sử dụng lại một RegExp cụ thể - đó không phải là thời điểm tốt để sử dụng một hàm tạo? Hoặc bạn sẽ chỉ nói 'var resuasableRegex =/.. pattern ../;'? –

+0

@ElRonnoco: Chính xác, bạn cũng có thể gán một regex cho một biến. –

+0

Cảm ơn thông tin. Lần tới tôi sẽ xem xét các chuỗi tốt hơn, để đảm bảo không có ký tự thoát cần thiết. Dù sao, chữ cũng dễ dàng hơn nhiều. –

4

\d cần phải được thoát khi passd đến new RegExp hàm tạo. Vì vậy, nó cần phải được

var parts = new RegExp("rt:([^@]+)@(\\d+)").exec(tag); 
Các vấn đề liên quan