2016-06-29 2 views
3

Ich muss alle Elemente eines Arrays (Strings) überprüfen, wenn sie mit Regex übereinstimmt, die auch in einem Array gespeichert ist.Überprüfen Sie mehrere Zeichenfolgen für die Zuordnung mehrerer Regex (beide Array)

Also hier ist der String-Array und und regex Array (in diesem Beispiel alle drei Elemente die gleiche Regex sind - ich weiß, dass nicht Sinn macht):

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

Jetzt würde ich zwei _.each -loops wie folgt aus:

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

Aber was will ich erreichen, ist, dass, wenn nur eine regex ist passend, ich diese Zeichenfolge bearbeiten möchten. Mit diesem sinnlosen Regex-Array wäre das nie der Fall, da es keine oder drei passende Regex-Ausdrücke gäbe.

Außerdem würde ich gerne wissen, ob es möglich ist, diese verschachtelte each-Schleife zu vermeiden.

aktualisieren

Beispiel:

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 

so nur das Ergebnis für array [1] und array [2] sollte für die weitere Verarbeitung doSomething(match)

Antwort

2

Sie nutzen könnten Array#reduce verwendet werden und Zählen Sie die Spiele. Wenn count gleich 1 ist, dann weiter verarbeiten.

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

Benötige ich die 'var = match'? Kann ich nicht einfach 'regexes.some (r => r.exec (a))' '? – user3142695

+0

nur wenn du etwas mit 'match' liebst. –

+0

'some' überprüft, ob eines der Elemente in einem Array einen Test besteht, richtig? Das Ergebnis wäre also das gleiche, wenn eine Regex übereinstimmt oder mehrere Regexes mit der Zeichenfolge übereinstimmen, richtig? Aber ich möchte überprüfen, ob nur eine Regex mit der Zeichenfolge übereinstimmt. Wenn mehrere Regexes übereinstimmen, sollte es auch ungültig sein, da es keine Übereinstimmung gibt. – user3142695

0

können Sie kombinieren Array.prototype.filter und 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)

Verwandte Themen