javascript - match string against the array of regular expressions

前端 未结 8 1437
予麋鹿
予麋鹿 2020-12-02 22:23

Is there a way in JavaScript to get Boolean value for a match of the string against the array of regular expressions?

The example would be (where the \'if\' statemen

相关标签:
8条回答
  • 2020-12-02 22:39

    Using a more functional approach, you can implement the match with a one-liner using an array function:

    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); });
    
    0 讨论(0)
  • 2020-12-02 22:45

    look this way...

    function matchInArray(stringSearch, arrayExpressions){
        var position = String(arrayExpressions).search(stringSearch);
        var result = (position > -1) ? true : false
        return result;
    }
    
    0 讨论(0)
  • 2020-12-02 22:46
    let expressions = [ '/something/', '/something_else/', '/and_something_else/'];
    
    let str = 'else';
    

    here will be the check for following expressions:

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

    using Array .find() method to traverse array and .include to check substring

    0 讨论(0)
  • 2020-12-02 22:47

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

    var thisExpressions = [/something/, /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)​
    
    0 讨论(0)
  • 2020-12-02 22:48

    So we make a function that takes in a literal string, and the array we want to look through. it returns a new array with the matches found. We create a new regexp object inside this function and then execute a String.search on each element element in the array. If found, it pushes the string into a new array and returns.

    // 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 element@index into our matchbin.
        match_bin.push(target_arr[i]);
        }
      }
      return match_bin;
    }
    
    // arr_grep(/.*this_word.*/ig, someArray)
    
    0 讨论(0)
  • 2020-12-02 22:51

    You can join all regular expressions into single one. This way the string is scanned only once. Even with a sligthly more complex regular expression.

    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!!");
    } 
    

    In fact, even with this approach, if you need check the same expression set against multiple strings, this is a few suboptimal because you are building (and compiling) the same regular expression each time the function is called.

    Better approach would be to use a function builder like this:

    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!!");
    } 
    
    0 讨论(0)
提交回复
热议问题