【问题标题】:Javascript if arrays contains string with regexJavascript,如果数组包含带有正则表达式的字符串
【发布时间】:2016-04-13 19:30:06
【问题描述】:

我想知道变量 url 是否匹配数组的任何值
例如,这是我的数组:

var arr = ["test", "foo", "bar", "news-[0-999999999999999]*"];

...和我的字符串

var url = "news-294";

我需要检查每个 arr 值是否与 url 匹配,regex

所以我在数组上尝试了foreachnew RegExp 为每个值,然后检查它是否匹配。但它效果不佳,它正在泄漏我的浏览器内存(CPU 是 24% 用于脚本的空白页)

我该怎么做?谢谢

编辑:这是我的代码:

var CMS = {
    RegexMatch: function(regex, str, callback) {
        while ((m = regex.exec(str)) !== null) {
            if(m[0] == str) callback();
        }
    },
    ArrayFindRegex: function(array, str, callback) {
        array.forEach(function(e) {
            CMS.RegexMatch(new RegExp(e), str, function() {
                callback();
            });
        });
    },
        Check: function() {
                var url = "blabla";
                CMS.ArrayFindRegex(["test", "foo", "bar", "news-[0-999999999999999]*"], url, function() {
                    console.log('wow');
                });
            }
        }
}

【问题讨论】:

  • 将您的代码添加到问题中,以便我们查看发生了什么。另外,如果找到匹配项,您希望发生什么?
  • 执行callback()。只是发布我的代码等待
  • 如果你想做正则表达式测试,为什么要从字符串开始?只需存储正则表达式:var arr = [/test/, /foo/, /bar/, /news-\d+/];,然后执行arr.forEach(re => re.test(...))for (re of arr) { re.test(...) }(这样做的好处是后者可以让你跳出循环,而前者不会)
  • @Mike'Pomax'Kamermans 你能回答一下吗?
  • @MrZ,检查你的花括号。看来您在定义 CMS 时也有一些错误。

标签: javascript arrays regex


【解决方案1】:

改用Array.prototype.filter。它比每个(或其他迭代方法,在这种情况下)更符合规范。 filter 返回一个数组,其内容为任何匹配项,如果没有找到则为空。

var arr = ["test", "foo", "bar", "news-[0-999999999999999]*"];
var url = "news-294";

var matches = arr.filter(function(pattern) {
  return new RegExp(pattern).test(url);
})

console.log(matches);

上面的例子记录了["news-[0-999999999999999]*"]。您可以根据matches 的长度断言肯定结果。

【讨论】:

  • 对那个可怕的正则表达式本身没有评论,那么?
  • 你是对的,原始代码可以改进,但其他人似乎在提供建议。我只是想为 OP 当前拥有的内容提供解决方案,而不是重构。
【解决方案2】:

如果您打算进行正则表达式匹配,请从正则表达式开始,而不是字符串。

var arr = [/test/, /foo/, /bar/, /news-\d+/];

然后您可以进行正常匹配,而无需奇怪的字符串重写或解释:

var matched = arr.some(re => re.test(...))
if (matched) {
  doSomeThing()
}

for (re of arr) {
  if (re.test(...)) {
    doSomeThing();
    break;
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-08
    • 2011-06-27
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多