2010-09-30 41 views
13

Từ nghiên cứu của tôi, có vẻ như các biểu thức chính quy của Javascript không có bất kỳ tích hợp nào tương đương với công cụ sửa đổi Perl/x, hoặc công cụ sửa đổi RegexOptions.IgnorePatternWhitespace của .NET. Chúng rất hữu ích vì chúng có thể làm cho một regex phức tạp dễ đọc hơn nhiều. Thứ nhất, tôi đã bỏ lỡ một cái gì đó và có một Javascript được xây dựng trong tương đương với những? Thứ hai, nếu không có, không ai biết một plugin jQuery tốt sẽ thực hiện chức năng này? Đó là một sự xấu hổ để có nén regex phức tạp của tôi thành một dòng vì hạn chế regex rõ ràng của Javascript.Bỏ qua khoảng trắng trong các mẫu biểu thức chính quy Javascript?

+0

Tại sao sử dụng jQuery? jQuery không phải là cách duy nhất để nhập mã bên ngoài. –

Trả lời

14

Nếu tôi hiểu chính xác bạn muốn thêm khoảng trắng không phải là một phần của regexp? Theo như tôi biết nó không thể với regexp chữ.

Ví dụ:

var a = /^[\d]+$/ 

Bạn có thể phá vỡ các regexp trong một vài dòng như thế này:

var a = RegExp(
    "^" + 
    "[\\d]+" + // This is a comment 
    "$" 
); 

Chú ý rằng vì nó bây giờ là một chuỗi bình thường, bạn phải thoát \ với \\

Hoặc nếu bạn có tổ hợp phức tạp:

var digit_8 = "[0-9]{8}"; 
var alpha_4 = "[A-Za-z]{4}"; 
var a = RegExp(
    digit_8 + 
    alpha_4 + // Optional comment 
    digit_8 
); 

Cập nhật: Sử dụng một mảng tạm thời để nối các biểu thức chính quy:

var digit_8 = "[0-9]{8}"; 
var alpha_4 = "[A-Za-z]{4}"; 
var a = RegExp([ 
    digit_8, 
    alpha_4, // Optional comment 
    digit_8, 
    "[0-9A-F]" // Another comment to a string 
].join("")); 
+2

Vâng, nhưng không giống nhau. Bạn có cú pháp nối chuỗi Javascript thêm xấu xí và bạn vẫn không thể đặt các nhận xét kiểu Perl ở cuối dòng, như: h (a | o) t # <- khớp với mũ hoặc nóng – Jez

+2

@Jez: Nhưng bạn có thể đặt chú thích JavaScript ở đó. Không có cách nào khác, thật không may. JS không hỗ trợ regexes tiết. –

+4

JavaScript không phải là perl. – Incognito

8

Đáng tiếc là không có tùy chọn như vậy trong ES5, và tôi nghi ngờ nó dường như không bao giờ có trong RegExp literals, vì họ đã rất khó phân tích cú pháp và ngắt dòng sẽ khiến chúng trở nên mơ hồ hơn.

Nếu bạn muốn dễ dàng thoát và tô sáng cú pháp của RegExp literals, bạn có thể tham gia bằng cách tận dụng thuộc tính source. Đó không phải là hoàn hảo, nhưng IMHO ít xấu hơn rơi xuống tất cả các cách trở lại chuỗi:

new RegExp(
    /foo/.source + 
    /[\d+]/.source + 
    /bar/.source 
); 

Trong ES6 bạn có thể tạo mẫu của bạn chuỗi riêng:

regexp` 
    foo 
    [\d+] 
    bar 
`; 

function regexp(parts) { 
    // I'm ignoring support for ${} placeholders for brevity, 
    // but full implementation should escape them. 

    // Note that `.raw` allows use of \d instead of \\d. 
    return new RegExp(parts.raw.join('').replace(/\s+/g,'')); 
} 
Các vấn đề liên quan