You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C# WinForm中为以@开头的表达式添加颜色高亮问题求助

解决RichTextBox中@开头表达式的标色问题

我来帮你搞定这个问题!你之前的代码存在两个核心问题:

  • IndexOf(' ')和行内索引判断的方式太局限,没法适配@符号前无空格、或表达式后不是空格的场景
  • 计算选中位置时没考虑行在RichTextBox里的全局起始偏移量,导致选色位置完全错位

推荐用正则表达式精准匹配所有@开头的目标内容,以下是修正后的完整实现:

完整代码示例

private void richTextBox1_TextChanged(object sender, EventArgs e)
{
    // 先保存当前光标位置,避免处理后光标乱跑
    int currentCursorPos = richTextBox1.SelectionStart;
    int currentCursorLen = richTextBox1.SelectionLength;

    // 暂时解绑TextChanged事件,防止修改文本时反复触发造成逻辑混乱
    richTextBox1.TextChanged -= richTextBox1_TextChanged;

    try
    {
        // 先把所有文本恢复默认颜色,避免多次输入后颜色残留
        richTextBox1.SelectAll();
        richTextBox1.SelectionColor = Color.Empty;

        // 正则表达式:匹配@开头的连续单词字符(字母/数字/下划线)
        // \B确保@前面不是单词字符(避免误匹配类似"user@domain.com"里的@domain)
        Regex regex = new Regex(@"\B@\w+");
        MatchCollection matches = regex.Matches(richTextBox1.Text);

        // 遍历所有匹配项,设置红色高亮
        foreach (Match match in matches)
        {
            richTextBox1.Select(match.Index, match.Length);
            richTextBox1.SelectionColor = Color.Red;
        }
    }
    finally
    {
        // 恢复光标位置和事件绑定
        richTextBox1.Select(currentCursorPos, currentCursorLen);
        richTextBox1.TextChanged += richTextBox1_TextChanged;
    }
}

关键细节说明

  1. 光标体验优化:处理前记录光标位置,处理完后恢复,保证用户输入时不会被打断
  2. 事件防重复触发:临时解绑TextChanged事件,避免修改文本时反复触发事件,提升性能
  3. 正则表达式适配性
    • @"\B@\w+"\B确保@前面不是字母/数字/下划线,避免误匹配带@的邮箱类内容;\w+匹配@后面的连续单词字符
    • 如果你的表达式需要支持特殊字符(比如@my-expression),可以把正则改成@"\B@[\w-]+",按需调整即可
  4. 全局索引定位:正则匹配返回的match.Index是整个RichTextBox文本的全局索引,完美解决了你之前用行内索引导致的选色错位问题

内容的提问来源于stack exchange,提问作者Eduardo Remor

火山引擎 最新活动