You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# Winform RichTextBox关键词高亮仅匹配部分字符问题求助

问题根因

你的代码存在两个核心错误,直接导致高亮定位异常:

  1. 正则大小写匹配逻辑写反
    Search方法中判断大小写敏感的选项逻辑刚好颠倒:当你设置CaseSensitive = true(默认值)时,反而给正则加了RegexOptions.IgnoreCase(忽略大小写)参数,会导致匹配结果和预期的字符位置、长度出现偏差。
  2. 批量高亮逻辑存在严重的定位混乱
    SelectKeywords方法完全没有使用遍历到的Match对象的位置、长度信息,反而依赖NextMatch的跳转逻辑定位:
  • NextMatch内置了「匹配到最后一项自动跳回第一项」的逻辑,用于批量遍历场景时会出现索引越位
  • 多次跳转后CurrentMatch的位置和当前遍历的匹配项完全错位,选中的起始位置、长度都不对,最终只能给部分字符染色。
修复方案

只需修改两处代码即可解决问题:

  1. 修正正则大小写判断逻辑
    将Search方法中的正则选项行替换为:
var options = RegexOptions.Multiline | (CaseSensitive ? RegexOptions.None : RegexOptions.IgnoreCase);
  1. 重写SelectKeywords方法,直接用匹配项自身信息定位,避免跳转混乱
private void SelectKeywords()
{
    // 批量给所有匹配项染普通高亮色
    foreach (Match m in Matches)
    {
        m_Rtb.Select(m.Index, m.Length);
        m_Rtb.SelectionColor = SelectionColor;
    }
    // 定位到第一个匹配项,染当前选中色
    m_bsMatches.MoveFirst();
    SelectText(true);
}
可选优化(完整单词匹配)

如果需要仅匹配独立的完整Using单词,避免匹配到UsingTest这类长单词中包含的关键词片段,可以修改正则匹配规则,给关键词前后加单词边界符:

Matches = Regex.Matches(m_Rtb.Text, $@"\b{Regex.Escape(keywords)}\b", options);

内容的提问来源于stack exchange,提问作者Daniel Lip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 01:09:01