我正在尝试编写“模糊”匹配,但找不到解决此问题的方法:
中的数据:makrusakkk
,查询:mrk
,预期结果:<b>m</b>ak<b>r</b>usa<b>k</b>kk
。
正则表达式:"makrusakkk".match(/(m).*?(r).*?(k)/i)
返回["makrusak", "m", "r", "k"]
.
所以问题是:有没有办法使用 RegExp 获得预期的结果?
我正在尝试编写“模糊”匹配,但找不到解决此问题的方法:
中的数据:makrusakkk
,查询:mrk
,预期结果:<b>m</b>ak<b>r</b>usa<b>k</b>kk
。
正则表达式:"makrusakkk".match(/(m).*?(r).*?(k)/i)
返回["makrusak", "m", "r", "k"]
.
所以问题是:有没有办法使用 RegExp 获得预期的结果?
我认为对此类问题使用正则表达式会使事情变得更加复杂。以下基于字符串和循环的解决方案将导致结果:
function fuzzySearch(query, input) {
var inds = patternMatches(query, input);
if(!inds) return input;
var result = input;
for(var i = inds.length - 1; i >= 0; i--) {
var index = inds[i];
result = result.substr(0,index) +
"<b>" + result[index] + "</b>" +
result.substr(index+1);
}
return result;
}
function patternMatches(query, input) {
if(query.length <= 0) {
return [];
} else if(query.length == 1) {
if(input[0] == query[0]) return [0];
else return [];
} else {
if(input[0] != query[0])
return false;
var inds = [0];
for(var i = 1; i < query.length; i++) {
var foundInd = input.indexOf(query[i], inds[i-1]);
if(foundInd < 0) {
return [];
} else {
inds.push(foundInd);
}
}
return inds;
}
}
var input = "makrusakkksd";
var query = "mrk";
console.log(fuzzySearch(query, input));
console.log(patternMatches(query, input));
这里也是一个现场演示:http: //jsfiddle.net/sinairv/T2MF4/
在这里您将需要for
:
function search_for_it(txt, arr){
for(i=0;i<arr.length;i++){
var reg = new RegExp(arr[i], "i");
txt = txt.replace(reg, "<b>"+arr[i]+"</b>");
}
return txt;
}
search_for_it("makrusakkk", ["m","r","k"]);
//return "<b>m</b>a<b>k</b><b>r</b>usakkk"
PS:您的预期结果不正确。先有k
后有a
。
有没有办法使用 RegExp 获得预期的结果?
有。
"makrusakkk".replace(/(m)(.*?)(r)(.*?)(k)/i, '<b>$1</b>$2<b>$3</b>$4<b>$5</b>')
我对此感到隐隐约约的肮脏,但是……无论如何;这是一种方法:
$('#s').keyup(
function(e) {
var w = e.which;
if (w == 8 || w == 46) {
return false;
}
var listElems = $('ul:first li'),
search = $(this).val().replace(/w+/g, ''),
r = search.split(''),
rString = [];
$.each(r, function(i, v) {
rString.push('(' + v + ')');
});
var reg = new RegExp(rString.join('(\\d|\\D)*'), 'gi');
listElems.each(
function() {
if (!$(this).attr('data-origtext')) {
$(this).attr('data-origtext', $(this).text());
}
$(this).html($(this).attr('data-origtext').replace(reg, '<b>$&</b>'));
});
});
不过,几乎可以肯定,它可以从相当多的简化中受益。
参考: