2012-04-14 17 views
17

Czy istnieje sposób w JavaScript, aby uzyskać wartość logiczną dla dopasowania ciągu w stosunku do tablicy wyrażeń regularnych?javascript - dopasuj wyrażenie regularne do tablicy elementów

Przykładem byłoby (gdzie 'if' oświadczenie reprezentujący co próbuję osiągnąć):

var thisExpressions = [ '/something/', '/something_else/', '/and_something_else/']; 
var thisString = 'else'; 

if (matchInArray(thisString, thisExpressions)) { 

} 
+0

W jaki sposób nie używasz pętli? –

+0

Szukasz dopasowania przeciwko wszystkim wyrażeniom (AND) lub dowolnemu wyrażeniu (OR)? – Arth

+0

Z jquery można użyć jQuery.inArray(); – GillesC

Odpowiedz

7

http://jsfiddle.net/9nyhh/1/

var thisExpressions = [/something/, /something_else/, /and_something_else/]; 
var thisExpressions2 = [/else/, /something_else/, /and_something_else/]; 
var thisString = 'else'; 

function matchInArray(string, expressions) { 

    var len = expressions.length, 
     i = 0; 

    for (; i < len; i++) { 
     if (string.match(expressions[i])) { 
      return true; 
     } 
    } 

    return false; 

}; 

setTimeout(function() { 
    console.log(matchInArray(thisString, thisExpressions)); 
    console.log(matchInArray(thisString, thisExpressions2)); 
}, 200)​ 
+0

Dzięki gillesc - wygląda na to, że działa dobrze! – user398341

+1

Dlaczego nie usunąć całkowicie zmiennej res, zwrócić wartość true w instrukcji if i zwrócić wartość false na końcu. Następnie zakończy się po znalezieniu pierwszego dopasowania. – Arth

+0

Również użyłbym wyrażeń [i] .test (string) zamiast string.match() – Arth

4

Można użyć .test() która zwraca wartość logiczną kiedy znajdziesz to, czego szukasz w innym ciągu:

var thisExpressions = [ '/something/', '/something_else/', '/and_something_else/']; 
var thisString = new RegExp('\\b' + 'else' + '\\b', 'i'); 
var FoundIt = thisString.test(thisExpressions); 
if (FoundIt) { /* DO STUFF */ } 
+0

Funkcja RegExp.prototype.test() nie może być używana z tablicą. Bierze ciąg. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test – gdibble

+1

@gdibble to zadziała, ponieważ 'test' wywołuje' toString' na podanym argumencie, który dla tablicy będzie 'join()'. Prawdopodobnie nie jest to wskazane! – WickyNilliams

+0

Przykład: '/monkey/.test ({toString:() =>" monkey "}) // true' – WickyNilliams

1

spójrz w ten sposób ...

function matchInArray(stringSearch, arrayExpressions){ 
    var position = String(arrayExpressions).search(stringSearch); 
    var result = (position > -1) ? true : false 
    return result; 
} 
+0

Chociaż ten kod może odpowiedzieć na pytanie, dostarczając dodatkowy kontekst dotyczący _why_ i/lub _how_ to odpowiada pytanie byłoby znacznie poprawić jego długoterminową wartość . Proszę [edytuj] swoją odpowiedź, aby dodać wyjaśnienie. –

-1

Tak więc tworzymy funkcję, która przyjmuje ciąg literalny i tablicę, którą chcemy przejrzeć. zwraca nową tablicę z znalezionymi dopasowaniami. Tworzymy nowy obiekt regexp wewnątrz tej funkcji, a następnie wykonujemy String.search na każdym elemencie elementu w tablicy. Jeśli zostanie znaleziony, przesuwa ciąg znaków do nowej tablicy i zwraca.

// literal_string: a regex search, like /thisword/ig 
// target_arr: the array you want to search /thisword/ig for. 

function arr_grep(literal_string, target_arr) { 
    var match_bin = []; 
    // o_regex: a new regex object. 
    var o_regex = new RegExp(literal_string); 
    for (var i = 0; i < target_arr.length; i++) { 
    //loop through array. regex search each element. 
    var test = String(target_arr[i]).search(o_regex); 
    if (test > -1) { 
    // if found push the [email protected] into our matchbin. 
    match_bin.push(target_arr[i]); 
    } 
    } 
    return match_bin; 
} 

// arr_grep(/.*this_word.*/ig, someArray) 
+0

jak to jest? to jest lepsze tak? – Mod

20

Stosując podejście bardziej funkcjonalny, można zaimplementować mecz z jedną wkładką stosując array function:

ECMAScript 6:

const regexList = [/apple/, /pear/]; 
const text = "banana pear"; 
const isMatch = regexList.some(rx => rx.test(text)); 

ECMAScript 5:

var regexList = [/apple/, /pear/]; 
var text = "banana pear"; 
var isMatch = regexList.some(function(rx) { return rx.test(text); }); 
+0

Świetne proste rozwiązanie. Używam go do sprawdzania wartości useragent w pliku express.js – Blejzer

+0

Warto również wspomnieć o metodzie 'filter' dla' Array's, która jest często użyteczna i używana w ten sam sposób. –

Powiązane problemy