我写了一个在HTML字符串中突出显示关键字的方法。它返回更新的字符串和匹配关键字的列表。
我想匹配这个词,如果它作为一个整体出现或与破折号。
但如果它出现破折号,则包括破折号的单词将突出显示并返回。
例如,如果单词locks且HTML包含He -locks- the door,则单词周围的破折号也会突出显示:

He <span style=\"background-color:yellow\">-locks-</span> the door.

而不是:
He -<span style=\"background-color:yellow\">locks</span>- the door.

此外,返回的列表包含-locks-,而不是locks
我该怎么做才能得到我期望的结果呢?
这是我的代码:
private static List<string> FindKeywords(IEnumerable<string> words, bool bHighlight, ref string text)
{
    HashSet<String> matchingKeywords = new HashSet<string>(new CaseInsensitiveComparer());

    string allWords = "\\b(-)?(" + words.Aggregate((list, word) => list + "|" + word) + ")(-)?\\b";
    Regex regex = new Regex(allWords, RegexOptions.Compiled | RegexOptions.IgnoreCase);

    foreach (Match match in regex.Matches(text))
    {
        matchingKeywords.Add(match.Value);
    }

    if (bHighlight)
    {
        text = regex.Replace(text, string.Format("<span style=\"background-color:yellow\">{0}</span>", "$0"));
    }

    return matchingKeywords.ToList();
}

最佳答案

您需要使用捕获的.Groups[2].Value而不是Match.Value,因为您的regex有3个捕获组,第二个捕获组包含您突出显示的关键字:

foreach (Match match in regex.Matches(text))
{
    matchingKeywords.Add(match.Groups[2].Value);
}

if (bHighlight)
{
    text = regex.Replace(text, string.Format("$1<span style=\"background-color:yellow\">{0}</span>$3", "$2"));
}

match.Groups[2].Value用于foreach中,然后$2是对regex.Replace替换字符串中捕获的关键字的反向引用。$1$3是突出显示单词周围的可选连字符(用(-)?捕获)。

关于c# - 使用C#正则表达式突出显示HTML字符串中的整个单词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30290291/

10-13 21:32