2016-06-29 5 views
3

Мне нужно проверить все элементы массива (строки), если они соответствуют любому регулярному выражению, которое также хранится в массиве.Проверьте несколько строк для сопоставления нескольких регулярных выражений (оба массива)

Так вот строка-массив и массив и регулярное выражения (в данном примере все три элемента является таким же регулярным выражением - я знаю, что не делает Sence):

let array = [ 'just some', 'strings', 'which should be tested', 'by regex' ]; 
let regexes = [ /([^.]+)[.\s]*/g, /([^.]+)[.\s]*/g, /([^.]+)[.\s]*/g ]; 

Теперь я хотел бы сделать два _.each -loops так:

_.each(array, function(element) { 
    _.each(regexes, function(regex) { 
     let match = regex.exec(element); 
     if (match && match.length) 
      doSomething(match); 
    }); 
}); 

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

Кроме того, я хотел бы знать, если можно избежать этого вложенного цикла.

Обновление

Пример:

let array = [ '1. string', 'word', '123' ] 
let regexes = [/([a-z]+)/, /([0-9]+)/] 

array[0] should NOT pass the test, as both regex are matching 
array[1] should pass the test, as just ONE regex is matching 
array[2] should pass the test, as just ONE regex is matching 

поэтому только результат для массива [1] и массив [2] следует использовать для дальнейшей обработки doSomething(match)

ответ

2

Вы можете использовать Array#reduce и подсчитывать совпадения. Если count равен 1, тогда перейдите далее.

var array = ['1. string', 'word', '123'], 
 
    regexes = [/([a-z]+)/, /([0-9]+)/]; 
 

 
array.forEach(function (a) { 
 
    var match, 
 
     count = regexes.reduce(function (count, r) { 
 
      var test = r.exec(a); 
 
      if (!test) { 
 
       return count; 
 
      } 
 
      match = test; 
 
      return count + 1; 
 
     }, 0); 
 

 
    count === 1 && console.log(match); 
 
});

+0

Нужно ли в 'вар = match'? Не могу ли я просто использовать 'regexes.some (r => r.exec (a))'? – user3142695

+0

, только если вам нравится что-то делать с 'match'. –

+0

'some' проверяет, прошел ли какой-либо из элементов массива тест, правильно? Таким образом, результат будет таким же, если одно регулярное выражение совпадает или несколько регулярных выражений соответствуют строке, верно? Но я хочу проверить, соответствует ли только одно регулярное выражение строке. Если несколько регулярных выражений совпадают, это также должно быть недействительным, так как нет соответствия. – user3142695

0

Вы можете комбинировать Array.prototype.filter и Array.prototype.every:

let array = ['1. string', 'word', '123'], 
 
    regexes = [/([a-z]+)/, /([0-9]+)/]; 
 

 

 
var result = array.filter(str => { 
 
    var count = 0; 
 
    return regexes.every(reg => { 
 
    reg.test(str) && count++; 
 
    return count <= 1; 
 
    }); 
 
}); 
 

 
console.log(result)