JavaScript RegExp将多个字符串替换为多个其他字符串

JavaScript RegExp将多个字符串替换为多个其他字符串,javascript,jquery,regex,Javascript,Jquery,Regex,我有一个自动完成(jQuery),我想突出显示下拉列表中出现在用户输入中的任何单词。用户输入:“圣水”,则圣水和水都应高亮显示,即使它们不是相邻的。因此,输入多个单词应突出显示多个单词(如果存在) 我试图通过使用正则表达式使文本加粗来实现这一点 _renderItem: function( ul, item ) { var termWords = this.term.trim().split(" ").join("|"); //if multiple words, split into

我有一个自动完成(jQuery),我想突出显示下拉列表中出现在用户输入中的任何单词。用户输入:“圣水”,则圣水和水都应高亮显示,即使它们不是相邻的。因此,输入多个单词应突出显示多个单词(如果存在)

我试图通过使用正则表达式使文本加粗来实现这一点

_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 );
}
但问题是,我输入的文本都不匹配,因此没有突出显示

这里是我正在尝试的JSFIDLE:,请注意,它与我自己的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 );
}
\u renderItem:功能(ul,项目){
var termWords=this.term.trim().split(“”).join(“|”);//如果有多个单词,拆分为多个部分,则使用OR重新连接
“(?:“+termWords+”[s]?)*”
var regex=new RegExp(((?:“+termWords+”)s?([\s,])?,“gi”);
var currentLabel=item.label;
var currentlab=currentlab.replace(regex,“$1$2”);

var itemHtml='

我相信您混淆了
{}
和简单括号。对于匹配某个或另一个,语法是
something | other
。如果需要将其括在非选择性括号中,语法是

(?:is|language[s]?)*
但是在这里,我不认为有必要使用
*
。您需要匹配所有出现的单词:您所要做的就是执行一个与这些单词匹配的正则表达式。
g
标志将负责重复该任务

然后,您的完整正则表达式应为:

"/((?:"+termWords+")s?)([\s.,])?/gi"
...
/((?:is|language)s?))([s.,])?/gi
([,]?)
部分(顺便说一句,你为什么在那里放了一个s?)似乎也有点限制。你可以用
(\W?
来代替英语(
\W
是非字母数字字符的缩写,即
[^a-zA-Z0-9]
,这意味着它会捕捉任何标点符号,但会弄乱像
journe
这样的单词)


在尝试捕捉复数时,您可能需要小心,在本例中,
iss
也会被捕捉到……这部分可能需要更多思考!

您需要使用单词边界(\b)

(\bis\b |\b语言\b)


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

嗯,我确实想加粗一个子字符串,而不是整个单词。例如,我仍然想突出显示brook,尽管我没有键入Brookstoneah,是的。我主要是根据您的第一段描述进行的。这会很有趣。说键入的第一个字符是“a”,您可能会得到很多高亮度的a。编辑答案,以了解您可能需要采取的一些预防措施。
"/((?:"+termWords+")s?)([\s.,])?/gi"
...
/((?:is|language)s?))([s.,])?/gi