0

「ファジー」マッチを書こうとしていますが、この問題を解決する方法が見つかりません:

データ: makrusakkk、クエリ: mrk、期待される結果: <b>m</b>ak<b>r</b>usa<b>k</b>kk

正規表現:を"makrusakkk".match(/(m).*?(r).*?(k)/i)返します["makrusak", "m", "r", "k"]

質問は次のとおりです。正規表現を使用して期待される結果を得る方法はありますか?

4

4 に答える 4

1

このような問題に正規表現を使用すると、事態はさらに複雑になると思います。次の文字列およびループ ベースのソリューションは、結果につながります。

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/

于 2012-06-02T13:36:55.273 に答える
0

私はこれについて漠然と汚い感じがします、しかし...関係なく; これを行う1つの方法は次のとおりです。

$('#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>'));
    });
});​

JSフィドルデモ

ただし、ほぼ確実に、かなり単純化することでメリットが得られる可能性があります。

参照:

于 2012-06-02T14:15:49.667 に答える
0

ここで必要になります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ます。

于 2012-06-02T04:32:29.520 に答える
0

RegExpを使用して期待される結果を得る方法はありますか?

がある。

"makrusakkk".replace(/(m)(.*?)(r)(.*?)(k)/i, '<b>$1</b>$2<b>$3</b>$4<b>$5</b>'​​​​​​​)
于 2012-06-02T13:14:42.727 に答える