如何使用依赖于变量的模式执行Javascript匹配?

时间:2009-04-28 15:56:43

标签: javascript regex autocomplete match

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]);
    }
}

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

3 个答案:

答案 0 :(得分:5)

如果您想在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]);
    }
}

答案 1 :(得分:2)

而不是

"/" + ctag + "/i"

使用

new RegExp(ctag, "i")

答案 2 :(得分:0)

您也可以继续使用indexOf,只需将=== 0更改为&gt; = 0:

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

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