JavaScript RegExp用多个其他字符串替换多个字符串

时间:2014-01-24 19:25:09

标签: javascript jquery regex

我有一个自动完成(jQuery),我想在其中突出显示用户输入中出现的下拉列表中的任何单词。用户输入:“圣水”,即使他们不是彼此相邻,也应该突出圣水和水。因此,输入多个单词应突出显示多个单词

Entering multiple words should highlight multiple words if present

我正在尝试使用正则表达式使文本变粗

_renderItem: function( ul, item ) {
    var termWords = this.term.trim().split(" ").join("|"); //if multiple words, split into parts, join back with ors to use in regexp
    var regex = new RegExp("({"+termWords+"[s]?}*)([\s\.,])","gi"); // convert to regex, make global and case insensitive
    var currentLabel = item.label;
    var currentLabel = currentLabel.replace(regex, "<b>$1</b>$2");
    var itemHtml = '<a>'+ currentLabel + '</a>';
    return $( "<li></li>" )
        .data( "item.autocomplete", item )
        .html(itemHtml)
        .appendTo( ul );
}

如果输入“is language”,尝试输出,输出表达式变为

/({is|language[s]?}*)([s.,])/gi

但问题是,我输入的文字都没有匹配,因此没有突出显示。

以下是我正在尝试的内容:http://jsfiddle.net/8tD49/5/,请注意,它与我自己的ajax函数返回的结果不完全相同,如图中所示。

修改:

突出显示多个字符串的最终答案:

_renderItem: function( ul, item ) {
    var termWords = this.term.trim().split(" ").join("|"); //if multiple words, split into parts, join back with ors
    "(?:"+termWords+"[s]?)*"
    var regex = new RegExp("((?:"+termWords+")s?)([\s.,])?","gi");
    var currentLabel = item.label;
    var currentLabel = currentLabel.replace(regex, "<b>$1</b>$2");
    var itemHtml = '<a>'+ currentLabel + '</a>';
    return $( "<li></li>" )
        .data( "item.autocomplete", item )
        .html(itemHtml)
        .appendTo( ul );
}

http://jsfiddle.net/8tD49/7/

2 个答案:

答案 0 :(得分:1)

我相信你混淆了{}和简单的括号。要匹配某个或其他内容,语法为something|other。如果需要用非选择性括号括起来,则语法为

(?:is|language[s]?)*

但在这里,我不认为*是必要的。你想要匹配几个单词的所有出现:你所要做的就是做一个匹配任何这些单词的正则表达式。 g标志将负责重复任务。

您的完整正则表达式应该成为:

"/((?:"+termWords+")s?)([\s.,])?/gi"
...
/((?:is|language)s?))([s.,])?/gi

([.,]?)部分(你为什么把它放在那里,顺便说一下?)似乎也有点限制性。您可以使用(\W?)代替英语(\W是非字母数字字符的缩写,即[^a-zA-Z0-9],这意味着它会捕获任何标点符号但会弄乱像journée这样的字词

当你试图捕捉复数时,你可能要小心,在这个例子中,iss也会被捕获......这部分可能需要更多思考!

答案 1 :(得分:1)

您需要使用字边界(\ b)

(\双\ C | \ blanguage \ b)中

这是正确的语言。上述正则表达式匹配语言