2015-02-02 14 views
8

Cách súc tích và hiệu quả nhất để dịch một chuỗi các chuỗi trong regex và sau đó sử dụng regex nhiều lần trên các chuỗi khác nhau để lấy kết quả phù hợp và sau đó lặp lại chúng? Bây giờ tôi đang sử dụng như sau:chuyển đổi mảng từ (chuỗi) thành regex và sử dụng nó để lấy các kết quả phù hợp trên chuỗi

var myArray = ['peaches', 'bananas', 'papaya', 'supercity']; 
var myString = 'I want some papaya and some peaches'; 

var regexFromMyArray = new RegExp(myArray.toString().replace(/,/g, '|'), 'gi'); 

var matches = myString.match(regexFromMyArray) || []; 

if (matches.length) { 
    for (var i = 0, l = matches.length; i < l; i++) { 
    console.log('Found: ' + matches[i]); 
    } 
} 

hiệu suất là quan trọng ở đây, vì vậy hãy javascript đơn giản.

Trả lời

14

Chỉ cần tham gia với đường ống dẫn, sử dụng Array.join

var regexFromMyArray = new RegExp(myArray.join("|"), 'gi'); 

và chỉ làm điều này như if điều kiện chỉ là dư thừa.

for(var i = 0; i < matches.length; i++) 
    console.log("Found:", matches[i]); 
  1. Một phương pháp đơn đang được sử dụng thay vì ban đầu 3. (toString nội bộ gọi join(",")) và replace chức năng cũng không được sử dụng.
  2. Chúng tôi đã xóa một điều kiện không cần thiết. Vì vậy, đó là khá nhanh chóng.

Và kể từ khi bạn nói về regexes, tôi muốn nói rằng

  1. Một khởi regex đơn sẽ không chi phí bạn nhiều.
  2. Nếu mục tiêu của bạn thực sự khớp với các từ trong mảng, sau đó chỉ cần đi với String.indexOf, đây là một hình thức phi regex để giải quyết tương tự.
+1

Vâng, tôi đoán bạn thực sự nên đề cập đến nhu cầu thoát khỏi chuỗi đầu vào trong trường hợp chúng chứa ký tự regexp đặc biệt. Ngoài ra, nếu OP rất lo lắng về hiệu suất, anh ta nên ít lo lắng về chi phí một lần của việc xây dựng regexp, và lo lắng hơn về hiệu suất phù hợp thực tế. Từ quan điểm đó, bạn có thể lựa chọn hiệu suất của regexps so với cách tiếp cận của việc kiểm tra từng chuỗi riêng lẻ? –

+0

@torazaburo Tôi chắc chắn. Bởi * Từ quan điểm đó, bạn có thể lựa chọn hiệu suất của regexps so với cách tiếp cận của việc kiểm tra từng chuỗi riêng lẻ? * Bạn có nghĩa là 'indexOf'? –

+0

Như thường lệ, câu trả lời tốt phụ thuộc vào kích thước của mảng ... Tôi đã thực hiện một [jsperf với cả hai nguồn của bạn và triển khai thực hiện của tôi với indexOf] (http://jsperf.com/match-on-string-an-array -những khả năng) ... có vẻ tốt hơn. –

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