javascript - сопоставить регулярное выражение с массивом элементов

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

Примером может быть (где оператор «if» представляет то, чего я пытаюсь достичь):

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

if (matchInArray(thisString, thisExpressions)) {

} 
</code>
 GillesC14 апр. 2012 г., 11:56
С jquery вы можете использовать jQuery.inArray ();
 Arth14 апр. 2012 г., 11:53
Вы ищете совпадение со всеми выражениями (И) или любым из выражений (ИЛИ)?

Ответы на вопрос(7)

вы можете реализовать совпадение с помощью одной строки, используяфункция массива:

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); });
 18 авг. 2017 г., 03:54
Также стоит упомянутьfilter метод дляArrayс, что часто полезно и используется таким же образом.

строка сканируется только один раз. Даже с чуть более сложным регулярным выражением.

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!!");
} 
 23 окт. 2018 г., 20:47
matchInArray(thisString, thisExpressions).index
 23 окт. 2018 г., 21:22
аааа ... я неправильно прочитал ваше возвращаемое утверждение внутри функции :)
 23 окт. 2018 г., 21:02
Будет ли это послеvar matchInArray = matchInArray_builder(thisExpressions);? как это:var matchInArray = matchInArray_builder(thisExpressions); var index = matchInArray(thisString, thisExpressions).index?
 23 окт. 2018 г., 19:50
Как насчет того, чтобы сказать, что мне нужен индекс сопоставляемого значения?
 23 окт. 2018 г., 21:16
Нет. Я добавил дополнительный параметр по ошибке.matchInArray() функция возвращает результатString.match(), Следовательно, на самом деле «если» условие - это не булево значение, а полная структура (которая оценивается как true), сообщающая о сопоставленной подстроке и ее положении & # x2026;
let expressions = [ '/something/', '/something_else/', '/and_something_else/'];

let str = 'else';

if( expressions.find(expression => expression.includes(str) ) ) {

}

использование метода Array .find () для обхода массива и .include для проверки подстроки

Вы могли бы использовать.тестовое задание() который возвращает логическое значение, когда находится то, что вы ищете в другой строке:

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 */ }
 23 окт. 2015 г., 12:42
Пример:/monkey/.test({ toString : () => "monkey" }) // true
 14 окт. 2015 г., 18:57
RegExp.prototype.test () нельзя использовать с массивом. Требуется строка.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
 23 окт. 2015 г., 12:42
@ gdibble это будет работать, потому чтоtest это вызываетtoString на предоставленный аргумент, который, для массива, будетjoin(), Вероятно, не рекомендуется, хотя!
 18 нояб. 2015 г., 02:17
@ GK79 a\b является границей слова - так, чтобы вы могли сопоставить/\broller\b/ только в слове "ролик" но он не будет соответствовать "американским горкам", однако, если вы сняли заднюю часть\b тогда он будет соответствовать первой части "американских горок"
 15 нояб. 2015 г., 16:17
@Likwid_T - что значит "\\ b" имею в виду ? Я знаю, что "я" означает нечувствительность к регистру, но я не смог найти в Интернете, что означает \\ b. Кроме того, почему у вас это дважды?

посмотри сюда ...

function matchInArray(stringSearch, arrayExpressions){
    var position = String(arrayExpressions).search(stringSearch);
    var result = (position > -1) ? true : false
    return result;
}
 06 мая 2016 г., 13:49
Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительноwhy и / илиhow ответ на вопрос значительно улучшит его долгосрочную ценность. пожалуйстаedit Ваш ответ, чтобы добавить некоторые объяснения.
Решение Вопроса

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

 /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)​
 14 апр. 2012 г., 12:08
Также я бы использовал выражения [i] .test (string) вместо string.match ()
 06 мая 2016 г., 13:49
Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительноwhy и / илиhow ответ на вопрос значительно улучшит его долгосрочную ценность. пожалуйстаedit Ваш ответ, чтобы добавить некоторые объяснения.
 23 окт. 2018 г., 19:50
Как насчет того, чтобы сказать, что мне нужен индекс сопоставляемого значения?
 14 апр. 2012 г., 12:07
Почему бы не полностью удалить переменную res, вернуть true в вашем операторе if и вернуть false в конце. Затем он выйдет при поиске первого совпадения.

мы создаем функцию, которая принимает буквальную строку и массив, который мы хотим просмотреть. он возвращает новый массив с найденными совпадениями. Мы создаем новый объект 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)

Ваш ответ на вопрос