2012-04-14 8 views
17

Gibt es eine Möglichkeit in JavaScript, booleschen Wert für eine Übereinstimmung der Zeichenfolge mit dem Array der regulären Ausdrücke zu erhalten?Javascript - passen Sie regulären Ausdruck gegen das Array von Elementen

Das Beispiel wäre (wo die 'if' Anweisung repräsentiert, was ich zu erreichen bin versucht):

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

if (matchInArray(thisString, thisExpressions)) { 

} 
+0

Wie benutzt man keine Schleife? –

+0

Suchen Sie nach einer Übereinstimmung mit allen Ausdrücken (AND) oder einem der Ausdrücke (OR)? – Arth

+0

Mit jquery können Sie jQuery.inArray(); – GillesC

Antwort

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

Danke Gillesc - es scheint gut zu funktionieren! – user398341

+1

Warum entfernen Sie die Res-Variable nicht vollständig, geben Sie in Ihrer if-Anweisung den Wert true zurück und geben Sie am Ende false zurück. Dann wird es aufhören, das erste Spiel zu finden. – Arth

+0

Auch würde ich Ausdrücke [i] .test (string) anstelle von string.match() verwenden – Arth

4

Sie .test() verwenden könnte, die einen Booleschen Wert zurückgibt Wenn Sie in einer anderen Zeichenfolge suchen, was Sie suchen:

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

RegExp.prototype.test() kann nicht mit einem Array verwendet werden. Es dauert eine Zeichenfolge. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test – gdibble

+1

@gdibble es wird funktionieren, weil 'test' ruft' toString' auf dem mitgelieferten Argument, das Für array wird 'join()'. Wahrscheinlich nicht empfehlenswert! – WickyNilliams

+0

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

1

sieh dir das an ...

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

Obwohl dieser Code die Frage beantworten könnte und zusätzlichen Kontext bezüglich _why_ und/oder _how_ zur Verfügung stellt, antwortet die die Frage erheblich verbessern Sie seine langfristige Wert. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erklärung hinzuzufügen. –

-1

Also machen wir eine Funktion, die eine literale Zeichenkette aufnimmt, und das Array, das wir durchsehen wollen. Es gibt ein neues Array mit den gefundenen Übereinstimmungen zurück. Wir erstellen ein neues regexp-Objekt innerhalb dieser Funktion und führen dann eine String.search für jedes Elementelement im Array aus. Wenn es gefunden wird, schiebt es die Zeichenfolge in ein neues Array und kehrt zurück.

// 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

wie ist das? das ist besser, ja? – Mod

20

einen funktionalen Ansatz verwenden, können Sie ein, das Spiel mit einem Einzeiler mit array function implementieren:

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

Große einfache Lösung. Ich benutze es, um Usereigent-Werte in express.js zu überprüfen. – Blejzer

+0

Erwähnenswert ist auch die 'filter'-Methode für' Array's, die oft nützlich ist und auf die gleiche Weise verwendet wird. –

Verwandte Themen