Соответствие JavaScript массиву

Я хотел бы знать, как сопоставить строку с массивом регулярных выражений.
Я знаю, как это сделать через массив.
Я также знаю, как это сделать, создавая длинное регулярное выражение, разделенное | Я надеялся на более эффективный способ, как

if (string contains one of the values in array) {

Например:

string = "the word tree is in this sentence";  
array[0] = "dog";  
array[1] = "cat";  
array[2] = "bird";  
array[3] = "birds can fly";  

В приведенном выше примере условие будет ложным.
Однако string = "She told me birds can fly and I agreed" вернет true.

Ответ 1

Как насчет создания регулярного выражения "на лету", когда вам это нужно (при условии, что массив изменяется с течением времени)

if( (new RegExp( '\\b' + array.join('\\b|\\b') + '\\b') ).test(string) ) {
  alert('match');
}

demo http://jsfiddle.net/gaby/eM6jU/


Для браузеров, поддерживающих javascript 1.6, вы можете использовать some() метод

if ( array.some(function(item){return (new RegExp('\\b'+item+'\\b')).test(string);}) ) {
 alert('match');
}

http://jsfiddle.net/gaby/eM6jU/1/

Ответ 2

(Много лет спустя)

Моя версия ответа @Gaby, поскольку мне нужен способ проверить происхождение CORS против регулярных выражений в массиве:

var corsWhitelist = [/^(?:.+\.)?domain\.com/, /^(?:.+\.)?otherdomain\.com/];

var corsCheck = function(origin, callback) {
  if (corsWhitelist.some(function(item) {
    return (new RegExp(item).test(origin));
  })) {
    callback(null, true);
  } 
  else {
    callback(null, false);
  }
}

corsCheck('otherdomain.com', function(err, result) {
  console.log('CORS match for otherdomain.com: ' + result);  
});

corsCheck('forbiddendomain.com', function(err, result) {
  console.log('CORS match for forbiddendomain.com: ' + result);  
});

Ответ 3

Это нормально?

function checkForMatch(string,array){
    var arrKeys = array.length;
    var match = false;
    var patt;
    for(i=0; i < arrKeys; i++ ){
        patt=new RegExp(" "+array[i]+" ");
        if(patt.test(string))
           match = true;
    }
    return match;
}

string = "She told me birds can fly and I agreed"; 

var array = new Array();
array[0] = "dog";  
array[1] = "cat";  
array[2] = "bird";  
array[3] = "birds can fly";


alert(checkForMatch(string, array));

Ответ 4

Если у вас есть литеральные строки в массиве с именем strings, который вы хотите сопоставить, вы можете комбинировать их с чередованием, выполняя

new RegExp(strings.map(
    function (x) {  // Escape special characters like '|' and '$'.
      return x.replace(/[^a-zA-Z]/g, "\\$&");
    }).join("|"))

Если у вас нет только буквенных строк, вы хотите комбинировать регулярные выражения, то вы используете http://code.google.com/p/google-code-prettify/source/browse/trunk/js-modules/combinePrefixPatterns.js

/**
 * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
 * matches the union of the sets of strings matched by the input RegExp.
 * Since it matches globally, if the input strings have a start-of-input
 * anchor (/^.../), it is ignored for the purposes of unioning.
 * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
 * @return {RegExp} a global regex.
 */