2012-04-14 14 views
17

¿Hay alguna forma en JavaScript para obtener un valor booleano para una coincidencia de la cadena con la matriz de expresiones regulares?javascript - coincide con la expresión regular frente a la matriz de elementos

El ejemplo sería (donde la sentencia 'if' está representando lo que estoy tratando de lograr):

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

if (matchInArray(thisString, thisExpressions)) { 

} 
+0

¿De manera que no usas un bucle? –

+0

¿Está buscando una coincidencia con todas las expresiones (Y) o alguna de las expresiones (O)? – Arth

+0

Con jquery puede usar jQuery.inArray(); – GillesC

Respuesta

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

Gracias gillesc - parece estar funcionando bien! – user398341

+1

¿Por qué no quita por completo la variable res, devuelve true en tu sentencia if y devuelve false al final? Luego se cerrará al encontrar el primer partido. – Arth

+0

También utilizaría las expresiones [i] .test (cadena) en vez de string.match() – Arth

4

usted podría utilizar .test() que devuelve un valor booleano cuando es encontrar lo que buscas en otra cadena:

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() no se puede utilizar con una matriz. Toma una cuerda. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test – gdibble

+1

@gdibble funcionará, porque 'test' llama a' toString' en el argumento proporcionado, que , para array, 'join()'. ¡Probablemente no sea aconsejable! – WickyNilliams

+0

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

1

mira de esta manera ...

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

Aunque este código puede responder a la pregunta, proporcionando contexto adicional con respecto a _why_ y/o _how_ responde la pregunta sería significativamente mejorar su valor a largo plazo . Por favor [edite] su respuesta para agregar alguna explicación. –

-1

Así que hacemos una función que toma en una cadena literal, y la matriz que queremos ver. devuelve una nueva matriz con las coincidencias encontradas. Creamos un nuevo objeto regexp dentro de esta función y luego ejecutamos String.search en cada elemento elemento de la matriz. Si se encuentra, empuja la cadena en una nueva matriz y regresa.

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

¿cómo es eso? eso es mejor si? – Mod

20

Utilizando un enfoque más funcional, se puede implementar el partido con una sola línea utilizando un 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

Gran solución simple. Lo uso para verificar contra los valores de useragent en express.js – Blejzer

+0

También vale la pena mencionar el método 'filter' para' Array's, que a menudo es útil y se usa de la misma manera. –

Cuestiones relacionadas