我写了一个突出显示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();
}
答案 0 :(得分:2)
您需要使用已捕获的.Groups[2].Value
代替Match.Value
,因为您的正则表达式有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
是突出显示的字词周围的可选连字符(使用(-)?
捕获)。