2015-11-10 16 views
6

sto cercando di controllare in modo efficiente se una stringa corrisponde a uno di una serie di espressioni regolari e restituire true nel primo match incontrato (Rompere l'iterazione negli regex)Come verificare se una stringa corrisponde a una qualsiasi serie di regex in node.js?

mio codice corrente:

_.forEach(self._connectedClients, function(client) { 
     if (client.authenticated) { 
      var interested = _.forEach(client.interests, function(interest) { 
       if (evt.event_type.search(interest) != -1) { 
        return true; 
       } 
      }); 
      if (interested) { 
       self._sendJSON(client.socket, data); 
      } 
     } 
    }); 

L'interesse è una serie di regex.

Qualche suggerimento?

Grazie in anticipo

+0

quindi, si desidera avere 'var regex = [/ a /,/b /,/c /]' e 'var string =" teststring "' e vedere quali regex corrispondono a true? – Kristian

+0

Wait, è 'client.interests' o' interest' una matrice di regex? –

+0

@Kristian Non mi interessa davvero quale corrispondenza voglio solo sapere se qualcuno di loro corrisponde. FelixKling Il client.interests è l'array di espressioni regolari. –

risposta

3

È possibile utilizzare _.some, quando la funzione passata restituisce un valore true, l'iterazione si interromperà e verrà restituito true. Se non riesce a trovare un valore di verità, restituirà false, dopo aver iterato attraverso l'intero array.

Esempio:

_.forEach(self._connectedClients, function(client) { 
    if (client.authenticated) { 
     if (_.some(client.interests, _.method('test', evt.event_type))) { 
      self._sendJSON(client.socket, data); 
     } 
    } 
}); 
+0

'.test' è un metodo su un'espressione regolare, non su una stringa. –

+0

oops, risolto. – fuzetsu

3

Basta usare Array#some:

some() esegue la funzione di richiamata una volta per ogni elemento presente nell'array fino a trovarne uno dove callback restituisce un valore vero. Se viene rilevato un elemento di questo tipo, some() restituisce immediatamente true.

var interested = client.interests.some(function(regex) { 
    return regex.test(evt.event_type); 
}); 

Naturalmente è anche possibile utilizzare _.some implementazione di lodash.

+0

È una buona risposta, ma @fuzetsu era più espanso. –

0

Se ti sto comprensione correttamente, utilizzando JavaScript pianura, si potrebbe fare le seguenti operazioni per verificare la presenza di matches of a single string over multiple regular expressions.

for(var i = 0; i<x.length; i++) { 
    var regex = x[i]; console.log('regex', regex); 
    if(str.match(x[i])) { 
    console.log("regex:",x[i]," matching: true"); 
    } else { 
    console.log("regex:",x[i]," matching: false"); 
    } 
} 

Tuttavia, se si intende qualcos'altro, quindi chiarire. :)

Problemi correlati