Сопоставьте строки с регулярным выражением, игнорируя определенный символ - PullRequest
1 голос
/ 05 ноября 2019

Мне нужно сравнить две строки в цикле, принимая определенный символ "-" в соответствующей строке.

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 ", даже если пользователь написал без" - "или наоборот.

Должен ли я использовать регулярное выражение для решения этой проблемы, или вы, ребята, видите какой-нибудь другой метод для меня, чтобы использовать

1 Ответ

1 голос
/ 05 ноября 2019

Когда вы строите регулярное выражение динамически, имеет смысл вставлять необязательный дефис между каждым символом.

Вы можете построить шаблон, используя

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

Вот это Пример демонстрации регулярного выражения .

При экранировании специальных символов :

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

Обратите внимание, что вам не нужен анонимный метод обратного вызова при замене для замены на все совпадение, вы можете использовать простой$& обратная ссылка на строку:

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

См. Разница между $ 1 и $ & в регулярных выражениях

JS demo:

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>') );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...