突出显示单词

时间:2014-06-17 16:27:14

标签: c# regex algorithm highlight

给定搜索查询:

Sheeky's

删除特殊字符,并将其缩小为:

sheekys

相同的过滤器应用于我正在搜索的数据库中的字段。这样就可以搜索:

sheekys

将返回名为“

”的项目的结果
Sheeky's Item

这是过滤器:

public static string FilterSearchQuery(string query)
{
    return Regex.Replace(query, "[^0-9A-Za-z ]", "");
}

在搜索结果视图中,匹配的单词会突出显示,如下所示:

public string HighlightText(string text)
{
    foreach (var word in HighlightWords)
    {
        var findWord = word.Trim();
        if (findWord.Length > 0)
        {
            var itemRegex = new Regex(findWord, RegexOptions.IgnoreCase);
            foreach (var match in itemRegex.Matches(text))
            {
                text = text.Replace(match.ToString(),
                    "¬¬¬¬¬¬¬____¬¬¬¬¬¬" + match.ToString() + "````````____`````");
            }
        }
    }
    text = text.Replace("¬¬¬¬¬¬¬____¬¬¬¬¬¬", "<span class=\"highlighted\">");
    text = text.Replace("````````____`````", "</span>");

    return text.Replace("</span> <span class=\"highlighted\">", " ");
}

这突出了精确匹配。但是,我想对其进行扩展,以便在搜索字词为Sheeky's时突出显示SheekyHighlightWords是搜索的字词列表(没有任何过滤)。

有谁知道怎么做?

2 个答案:

答案 0 :(得分:0)

我认为你可以这样做:

var itemRegex = new Regex(findWord + ".*", RegexOptions.IgnoreCase);

以上内容将匹配Sheeky以及之后的任何内容。

答案 1 :(得分:0)

问题是在原始文本中找到匹配,而忽略非字母。使用一些正则表达式魔法可以起作用:

var content = "This is a long string with word's, words and Words"; // the text to search in

var tofind = "W'ords"; // the text to search for

// prepare search value: remove non-letters/digits, set to lowercase
tofind = Regex.Replace(tofind, @"\W", "").ToLower();

// create search regex: allow non-letter between the letters
var findregex = String.Join(@"\W*", tofind.ToCharArray().Select(c => c.ToString()));

// surround matches with a <mark> tag
var content2 = Regex.Replace(content, findregex, "<mark>$0</mark>", RegexOptions.IgnoreCase);

结果是

  

This is a long string with <mark>word's</mark>, <mark>words</mark> and <mark>Words</mark>