2015-02-02 18 views
8

Jaki jest najbardziej zwięzły i skuteczny sposób tłumaczenia tablicy łańcuchów w wyrażeniu regularnym, a następnie użyj wyrażenia wielokrotnie na różnych ciągach, aby uzyskać wynik pasuje, a następnie iterować? Teraz używam następujące:zamień tablicę słów (ciągi znaków), aby wyodrębnić i użyj jej do uzyskania dopasowań na ciągu znaków.

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]); 
    } 
} 

wydajność jest tutaj ważne, więc zwykły javascript proszę.

Odpowiedz

14

Wystarczy połączyć się z rurociągiem, przy użyciu Array.join

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

i po prostu to zrobić jak if warunek jest po prostu zbędny.

for(var i = 0; i < matches.length; i++) 
    console.log("Found:", matches[i]); 
  1. Jeden sposób jest używany zamiast wstępnego 3. (toString wewnętrznie wywołuje join(",")) i replace funkcja nie jest stosowane.
  2. Usunęliśmy niepotrzebny warunek if. To dość szybko.

A skoro mówimy o regexes, chciałbym powiedzieć, że

  1. Pojedyncza inicjalizacji regex nie będzie kosztować dużo.
  2. Jeśli twoim celem jest naprawdę dopasowanie słów w tablicy, to po prostu przejdź z String.indexOf, który jest non-regex formą rozwiązania tego samego.
+1

Cóż, myślę, że naprawdę powinieneś wspomnieć o potrzebie ucieczki od ciągów wejściowych na wypadek, gdyby zawierały specjalne znaki regexp. Ponadto, jeśli OP jest tak zaniepokojony osiągami, powinien mniej martwić się jednorazowym kosztem budowania regexp i bardziej martwił się o faktyczne dopasowanie wydajności. Z tej perspektywy, czy mógłbyś skupić się na wydajności wyrażeń regularnych w porównaniu do podejścia polegającego na sprawdzaniu pojedynczego ciągu osobno? –

+0

@torazaburo Z pewnością. * Z tej perspektywy, czy mógłbyś się skupić na wydajności wyrażeń regularnych w porównaniu do podejścia polegającego na sprawdzaniu pojedynczego ciągu osobno? * Czy masz na myśli 'indexOf'? –

+0

Jak zwykle, dobra odpowiedź zależy od rozmiaru tablic ... Zrobiłem [jsperf z twoim źródłem i moją implementacją z indexOf] (http://jsperf.com/match-on-string-an-array -of-możliwości) ... wydaje się być lepszy. –

Powiązane problemy