Javascript - сопоставление регулярного выражения с массивом элементов
Есть ли способ в JavaScript получить Boolean значение для соответствия строки массиву регулярных выражений?
Пример будет (где оператор "if" представляет то, что я пытаюсь достичь):
var thisExpressions = [ '/something/', '/something_else/', '/and_something_else/'];
var thisString = 'else';
if (matchInArray(thisString, thisExpressions)) {
}
Ответы
Ответ 1
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)
Ответ 2
Используя более функциональный подход, вы можете реализовать совпадение с помощью однострочного интерфейса с помощью функции :
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); });
Ответ 3
Вы можете использовать .test(), который возвращает логическое значение, когда найти то, что вы ищете в другой строке:
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 */ }
Ответ 4
Посмотрите этот путь...
function matchInArray(stringSearch, arrayExpressions){
var position = String(arrayExpressions).search(stringSearch);
var result = (position > -1) ? true : false
return result;
}
Ответ 5
Вы можете объединить все регулярные выражения в одно. Таким образом, строка сканируется только один раз. Даже с чуть более сложным регулярным выражением.
var thisExpressions = [ /something/, /something_else/, /and_something_else/];
var thisString = 'else';
function matchInArray(str, expr) {
var fullExpr = new RegExp(expr
.map(x=>x.source) // Just if you need to provide RegExp instances instead of strings or ...
// .map(x=>x.substring(1, x.length -2) // ...if you need to provide strings enclosed by "/" like in original question.
.join("|")
)
return str.match(fullExpr);
};
if (matchInArray(thisString, thisExpressions)) {
console.log ("Match!!");
}
Фактически, даже при таком подходе, если вам нужно проверить один и тот же набор выражений для нескольких строк, это несколько неоптимально, потому что вы создаете (и компилируете) одно и то же регулярное выражение каждый раз, когда вызывается функция.
Лучшим подходом было бы использовать конструктор функций, например так:
var thisExpressions = [ /something/, /something_else/, /and_something_else/];
var thisString = 'else';
function matchInArray_builder(expr) {
var fullExpr = new RegExp(expr
.map(x=>x.source) // Just if you need to provide RegExp instances instead of strings or ...
// .map(x=>x.substring(1, x.length -2) // ...if you need to provide strings enclosed by "/" like in original question.
.join("|")
)
return function (str) {
return str.match(fullExpr);
};
};
var matchInArray = matchInArray_builder(thisExpressions);
if (matchInArray(thisString)) {
console.log ("Match!!");
}
Ответ 6
let expressions = [ '/something/', '/something_else/', '/and_something_else/'];
let str = 'else';
здесь будет проверка следующих выражений:
if( expressions.find(expression => expression.includes(str) ) ) {
}
использование метода Array.find() для обхода массива и .include для проверки подстроки
Ответ 7
Таким образом, мы создаем функцию, которая принимает литеральную строку и массив, который мы хотим просмотреть. он возвращает новый массив с найденными совпадениями. Мы создаем новый объект regexp внутри этой функции, а затем выполняем String.search для каждого элемента элемента в массиве. Если он найден, он вставляет строку в новый массив и возвращается.
// 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)