c# - 使用 C# 正则表达式突出显示 HTML 字符串中的整个单词

标签 c# html regex

我编写了一个方法来突出显示 HTML 字符串中的关键字。它返回更新后的字符串和匹配关键字的列表。 如果该单词显示为整个单词或带有破折号,我想匹配该单词。 但如果它与破折号一起出现,则包含破折号的单词将突出显示并返回。

例如,如果单词是 locks 并且 HTML 包含 He -locks- thedoor,则该单词周围的破折号也会突出显示:

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因为您的正则表达式有 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/

相关文章:

javascript - 如何在 div 中提交表单元素

Java REGEX .replaceall() 不适用于特定 JSON 对象(转换为字符串)

java - 可以用正则表达式提取函数调用吗

java - 在流上执行正则表达式

c# - 对 ViewState/IPostback 与持久文本框值感到困惑

c# - 我在说 "Assertion failed"之前从未见过的奇怪的 xCode 链接器错误

html - 为什么我的 CSS `ul li ~ li` 没有调整我的 HTML 元素之一?

javascript - 如何修复错误 "reference to entity "orderby“必须以 ';' 分隔符结尾”?

c# - C# 中的 QuickSort 错误复杂性

c# - 如何从另一个矩形中减去一个矩形?