【问题标题】:How do I perform a Javascript match with a pattern that depends on a variable?如何使用依赖于变量的模式执行 Javascript 匹配?
【发布时间】:2010-10-22 08:53:04
【问题描述】:

Remy Sharp's jQuery tag suggestion plugin 的当前实现仅检查标记开头的匹配项。例如,键入“Photoshop”不会返回名为“Adobe Photoshop”的标签。

默认情况下,搜索区分大小写。我稍微修改了它以修剪多余的空格并忽略大小写:

for (i = 0; i < tagsToSearch.length; i++) {
    if (tagsToSearch[i].toLowerCase().indexOf(jQuery.trim(currentTag.tag.toLowerCase())) === 0) {
        matches.push(tagsToSearch[i]);
    }
}

我尝试做的是再次修改它,以便在用户键入“Photoshop”时能够返回“Adobe Photoshop”。我尝试过使用match,但是当模式中存在变量时,我似乎无法让它工作:

for (i = 0; i < tagsToSearch.length; i++) {
    var ctag = jQuery.trim(currentTag.tag);
    if (tagsToSearch[i].match("/" + ctag + "/i")) { // this never matches, presumably because of the variable 'ctag'
        matches.push(tagsToSearch[i]);
    }
}

以这种方式执行正则表达式搜索的正确语法是什么?

【问题讨论】:

    标签: javascript regex autocomplete match


    【解决方案1】:

    如果你想在 JavaScript 中动态地做正则表达式,你必须使用RegExp object。我相信您的代码看起来像这样(尚未测试,不确定,但总体思路正确):

    for (i = 0; i < tagsToSearch.length; i++) {
        var ctag = jQuery.trim(currentTag.tag);
        var regex = new RegExp(ctag, "i")
        if (tagsToSearch[i].match(regex)) {
            matches.push(tagsToSearch[i]);
        }
    }
    

    【讨论】:

      【解决方案2】:

      代替

      "/" + ctag + "/i"
      

      使用

      new RegExp(ctag, "i")
      

      【讨论】:

        【解决方案3】:

        您也可以继续使用 indexOf,只需将您的 === 0 更改为 >= 0:

        for (i = 0; i < tagsToSearch.length; i++) {
            if (tagsToSearch[i].toLowerCase().indexOf(jQuery.trim(currentTag.tag.toLowerCase())) >= 0) {
                matches.push(tagsToSearch[i]);
            }
        }
        

        但话说回来,我可能错了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-17
          相关资源
          最近更新 更多