【问题标题】:javascript - match string against the array of regular expressionsjavascript - 将字符串与正则表达式数组匹配
【发布时间】:2012-04-26 12:22:03
【问题描述】:

在 JavaScript 中是否有一种方法可以获取布尔值以匹配字符串与正则表达式数组的匹配?

示例是('if' 语句代表我想要实现的目标):

var thisExpressions = [ '/something/', '/something_else/', '/and_something_else/'];
var thisString = 'else';

if (matchInArray(thisString, thisExpressions)) {

} 

【问题讨论】:

  • 您是在寻找针对所有表达式 (AND) 还是任何表达式 (OR) 的匹配项?
  • 使用 jquery 你可以使用 jQuery.inArray();

标签: javascript arrays expression


【解决方案1】:

使用更实用的方法,您可以使用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); });

【讨论】:

  • 另外值得一提的是Arrays的filter方法,这个方法经常有用,使用方法相同。
  • 另外,如果您希望它匹配数组中的所有内容,请查看 .every.some 如果匹配数组中的任何内容,则返回 true。
  • 这应该是现代 JavaScript 公认的答案。
【解决方案2】:

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)​

【讨论】:

  • 为什么不完全去掉 res 变量,在 if 语句中返回 true,最后返回 false。然后它将在找到第一个匹配项时退出。
  • 我也会使用表达式[i].test(string) 而不是 string.match()
  • 虽然此代码可能会回答问题,但提供有关 why 和/或 如何 回答问题的额外上下文将显着改善其长期价值。请edit你的答案添加一些解释。
  • 假设我想要匹配的值的索引呢?
【解决方案3】:

您可以使用.test(),当您在另一个字符串中找到您要查找的内容时,它会返回一个布尔值:

var thisExpressions = [ '/something/', '/something_else/', '/and_something_else/'];
var thisString = new RegExp('\\b' + 'else' + '\\b', 'i');
var FoundIt = thisString.test(thisExpressions);  
if (FoundIt) { /* DO STUFF */ }

【讨论】:

  • RegExp.prototype.test() 不能与数组一起使用。它需要一个字符串。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • @gdibble 它将起作用,因为test 它在提供的参数上调用toString,对于数组,它将join()。不过可能不建议这样做!
  • 示例:/monkey/.test({ toString : () =&gt; "monkey" }) // true
  • @Likwid_T - '\\b' 是什么意思?我知道 'i' 表示不区分大小写,但我在网上找不到 \\b 的含义。还有,你为什么要两次?
  • @GK79 a \b 是一个单词边界 - 这样您就可以在单词“roller”中匹配/\broller\b/,但它不会匹配“rollercoaster”,但是如果您取消尾随 \b 那么它将匹配“过山车”的第一部分
【解决方案4】:

往这边看……

function matchInArray(stringSearch, arrayExpressions){
    var position = String(arrayExpressions).search(stringSearch);
    var result = (position > -1) ? true : false
    return result;
}

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关 why 和/或 如何 回答问题的额外上下文将显着改善其长期价值。请edit你的答案添加一些解释。
【解决方案5】:

您可以将所有正则表达式合并为一个。这样字符串是 只扫描一次。即使是稍微复杂的正则表达式。

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

事实上,即使使用这种方法,如果您需要检查相同的表达式集 针对多个字符串,这是一些次优的,因为您正在构建 每次调用函数时(并编译)相同的正则表达式。

更好的方法是使用这样的函数构建器:

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

【讨论】:

  • 假设我想要匹配的值的索引呢?
  • matchInArray(thisString, thisExpressions).index
  • 它会追随var matchInArray = matchInArray_builder(thisExpressions); 吗?像这样:var matchInArray = matchInArray_builder(thisExpressions); var index = matchInArray(thisString, thisExpressions).index?
  • 没有。我错误地输入了一个额外的参数。 matchInArray() 函数返回 String.match() 的结果。因此,事实上“if”条件不是一个布尔值,而是一个完整的结构(计算结果为真)报告匹配的子字符串及其位置......
  • ahhhhh...我误读了您在函数中的返回语句:)
【解决方案6】:

考虑将这个问题分成两部分:

  1. filter取出match给定正则表达式的项目
  2. 确定过滤后的列表中是否包含 0 匹配项
const sampleStringData = ["frog", "pig", "tiger"];

const matches = sampleStringData.filter((animal) => /any.regex.here/.test(animal));

if (matches.length === 0) {
  console.log("No matches");
}

【讨论】:

    【解决方案7】:
    let expressions = [ '/something/', '/something_else/', '/and_something_else/'];
    
    let str = 'else';
    

    这里将检查以下表达式:

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

    使用Array .find() 方法遍历数组和.include 来检查子字符串

    【讨论】:

      【解决方案8】:

      如果你有全局标志,Andersh 的解决方案将不起作用。
      真正的回报将在未来的相同测试中打开和关闭。

      regexArray.some(rx => rx.test("a"));    //true
      regexArray.some(rx => rx.test("a"));    //false
      regexArray.some(rx => rx.test("a"));    //true
      

      (阅读为什么here

      这行得通,也是单线:

      const regexList = [/apple/, /pear/];
      const string = "banana pear";
      const isMatch = regexList.map(rx=>rx.source).includes(string);
      

      .source 返回正则表达式模式的文本。
      箭头函数返回每个元素的源数组。它们现在将是字符串。
      如果字符串在数组中,.includes 返回(如果需要索引,请使用 .indexOf)

      或者:

      function isInsideArray(string, regexArray){
          return(regexArray.map(regex=>regex.source).includes(string)); 
      }
      

      【讨论】:

        【解决方案9】:

        所以我们创建了一个函数,它接收一个文字字符串,以及我们想要查看的数组。它返回一个包含找到匹配项的新数组。我们在这个函数中创建一个新的 regexp 对象,然后对数组中的每个元素执行 String.search。如果找到,它将字符串推入一个新数组并返回。

        // 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)
        

        【讨论】:

        • 考虑到问题的简单性,这个解决方案太复杂了
        猜你喜欢
        • 2016-06-17
        • 2021-10-17
        • 1970-01-01
        • 2019-05-01
        • 2013-10-18
        • 2022-01-17
        • 1970-01-01
        • 2012-08-18
        • 1970-01-01
        相关资源
        最近更新 更多