1

我需要在一个循环中比较两个字符串,同时接受匹配字符串中的某个字符“-”。

function onDatabound(e) 
{
    var grid = e.sender;
    var str = $.trim(grid.value());
    var srcWords = str.split(" ");
    var records = $(grid.ul).find("li");
    for (var i = 0; i < records.length; i++) {
        var classes = $(records[i]).find("span i").attr("class");
        var newText = records[i].innerText;
        for (var j = 0; j < srcWords.length; j++) {
            var regex = new RegExp(srcWords[j], 'gi'); //case-insensitive
            newText = newText.replace(regex,
                function(match) {
                    return '<strong>' + match + '</strong>';
                });
        }
        $(records[i]).find("span").html("<i class='" + classes + "'></i>" +  newText);
    }
}

此代码完美运行,但需要最后的润色。即使用户不写字符“-”,我也需要替换功能来接受用户的输入。例子:

innerText:1111-2222 lorem ipsum dolar 11112222 lorem ipsum dolar

用户输入:11112222

我需要将这两个都突出显示“1111-2222”和“11112222”,即使用户没有写“-”,反之亦然。

我应该使用正则表达式来解决这个问题,还是你们看到我可以使用的其他方法?

4

1 回答 1

1

在动态构建正则表达式时,在每个字符之间插入一个可选的连字符是有意义的。

您可以使用构建模式

var regex = new RegExp(srcWords[j].split("").join("-?"), 'gi');

这是regex 的示例演示

转义特殊字符

var regex = new RegExp(srcWords[j].split("").map(function(s) { 
  return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
} ).join("-?"), 'gi');

请注意,您不需要在替换中使用匿名回调方法来替换整个匹配项,您可以使用纯$&字符串反向引用:

newText = newText.replace(regex,'<strong>$&</strong>');

请参阅正则表达式中 $1 和 $& 之间的区别

JS 演示:

var newText = "1111-2222 and 11112222";
var srcWords = "11112222";
var regex = new RegExp(srcWords.split("").map(function(s) { 
  return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
} ).join("-?"), 'gi');
console.log( newText.replace(regex,'<strong>$&</strong>') );

于 2019-11-05T10:51:35.460 回答