Itay Weiss
Itay Weiss

Reputation: 688

How to check if a string matches any of an array of regexes in node.js?

I'm trying to check efficiently if a string matches any of an array of regexes and return true in the first encountered match (Breaking the iteration over the regexes)

My current code:

_.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);
            }
        }
    });

Interest is an array of regexes.

Any suggestions?

Thanks in advance

Upvotes: 7

Views: 2887

Answers (3)

fuzetsu
fuzetsu

Reputation: 173

You could use _.some, when the function passed returns a truthy value iteration will stop and true will be returned. If it can't find a truthy value it will return false, after iterating through the entire array.

Example:

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

Upvotes: 4

Felix Kling
Felix Kling

Reputation: 816730

Just use Array#some:

some() executes the callback function once for each element present in the array until it finds one where callback returns a true value. If such an element is found, some() immediately returns true.

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

Of course you can also use lodash's _.some implementation.

Upvotes: 3

Kristian
Kristian

Reputation: 21830

If I'm understanding you correctly, using plain javascript, you could do the following to check for 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");
  }
}

However, if you meant something else, then do clarify. :)

Upvotes: 0

Related Questions