【问题标题】:C# Highlight words that end with colonC# 高亮以冒号结尾的单词
【发布时间】:2011-05-20 23:01:01
【问题描述】:

我正在使用 ScintillaNet,它是我的 C# 应用程序中 Scintilla 控件的包装器。我正在动态添加以 : 结尾的所有单词(从现在开始我们就调用这个关键字)。我通过使用正则表达式来做到这一点,每次用户按下冒号键时,用空格分隔的关键字字符串。这是我的代码(在 CharAdded 事件中):

        if (e.Ch == ':')
        {
            string wp = string.Empty;
            Regex r = new Regex(@"\b\w+[:\b]");
            MatchCollection m = r.Matches(Scintilla.Text);
            for (int i = 0; i < m.Count; i++)
            {
                wp += " " + m[i].Value.Substring(0, m[i].Value.Length - 1); // Remove the colon
            }
            wp = wp.ToLower();
            Scintilla.Lexing.Keywords[3] = wp;
        }

现在的问题是,每次输入新关键字并且用户按下冒号时,它不仅会突出显示关键字,还会不必要地再次突出显示文档中的每个关键字。因此,尽管我的编码有效,但它的编码非常糟糕,我想知道如何通过仅突出显示最后输入的关键字来使我的代码更快。任何帮助和/或想法将不胜感激。

【问题讨论】:

  • 这不能回答问题,但您应该从字符类中删除\b。首先,它在这种情况下并不意味着“单词边界”,其次,\b 在冒号之后无论如何都不会匹配,除非后面的字符是字母数字。只需使用\b\w+:

标签: c# regex search syntax highlighting


【解决方案1】:

其实没必要,你可以只检查最后一个单词,但是如果用户粘贴了很长的文本怎么办?除非您确定用户不会将文本粘贴到控件中或编辑文本的中间,否则您确实必须逐个检查每个单词。..

【讨论】:

  • 好吧,我已经计划将这段代码用于粘贴之类的事情(我会在 TextInserted 事件中使用它),但是当用户只键入一个时再次突出显示每个单词似乎真的很糟糕.当用户输入冒号时,有时会有大约 1-2 秒的延迟,对于长文档来说会很烦人。
  • 没有简单的方法,你只能检查关键字是否已经突出显示(我找不到你在代码中突出显示单词的部分??看起来只是将与您的正则表达式匹配的每个单词添加到 Scintilla.Lexing.Keywords ,我不知道那是什么......)
  • 我唯一没有突出显示的其他部分是 Scintilla.Styles[12].ForeColor = Color.blah。 Scintilla 本身处理词法分析/着色,我只提供关键字。另外,我如何检查关键字是否已经使用正则表达式突出显示?这就是我想做的,但我不知道怎么做。
【解决方案2】:

如果您的文本真的很长,并且您想缩短处理时间,那么尝试插入一个隐藏标签将单词标记为“突出显示”并在您的正则表达式中忽略这些标签会怎样?

【讨论】:

  • 我想这样做,但我不知道如何使用正则表达式来做到这一点。你能解释一下吗?
猜你喜欢
  • 1970-01-01
  • 2011-04-17
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 2023-04-11
相关资源
最近更新 更多