用正则表达式匹配字符串,同时忽略某些字符

Match strings with regex while ignoring certain character

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

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

此代码运行完美,但需要最后润色。我需要 replace-function 来接受用户的输入,即使他们不写字符“-”。示例:

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

用户输入:11112222

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

我应该使用正则表达式来解决这个问题吗?或者你们有没有其他方法可供我使用?

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

您可以使用

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

这里是sample demo of the regex

escaping special chars:

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

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

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

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>') );