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




