为什么我不能更改RichTextBox中重复单词的颜色?

时间:2018-12-08 07:37:17

标签: regex vb.net winforms

我的程序必须在RichTextBox中找到特定的单词并更改其颜色(简单的语法突出显示器)。我正在使用Regex查找单词。
我可以找到所有这些字符,但是如果我的文本包含2个或多个相同的单词,则只能更改第一个的颜色,而其他的则保持不变。

Dim words As String = "(in|handles|object|sub|private|dim|as|then|if|regex)"
Dim rex As New Regex(words)
Dim mc As MatchCollection = rex.Matches(RichTextBox1.Text.ToLower)

Dim lower_case_text As String = RichTextBox1.Text.ToLower
For Each m As Match In mc
    For Each c As Capture In m.Captures
        MsgBox(c.Value)
        Dim index As Integer = lower_case_text.IndexOf(c.Value)
        Dim lenght As Integer = c.Value.Length

        RichTextBox1.Select(index, lenght)
        RichTextBox1.SelectionColor = Color.Blue
    Next
Next

我的代码需要通过单击按钮来运行。我认为我的问题出在for each循环中,但是我不确定。
我已经有几个版本,但是没有一个版本。

3 个答案:

答案 0 :(得分:5)

可以使用某些RegexOptions

简化此方法
RegexOptions.Compiled Or RegexOptions.IgnoreCase

RegexOptions.Compiled
如果文本较长(执行速度更快,但启动速度较慢),则很有用。

RegexOptions.IgnoreCase
执行不区分大小写的匹配。您无需转换ToLower()文本。

RegexOptions.CultureInvariant
可以在必要时添加。

有关更多信息,请参见Regular Expression Options文档。
另外,如果模式的某些部分可能包含一些元字符,请参见Regex.Escape()方法。

您的代码可以简化为:

Dim pattern As String = "in|handles|object|sub|private|dim|as|then|if|regex"
Dim regx As New Regex(pattern, RegexOptions.Compiled Or RegexOptions.IgnoreCase)
Dim matches As MatchCollection = regx.Matches(RichTextBox1.Text)

For Each match As Match In matches
    RichTextBox1.Select(match.Index, match.Length)
    RichTextBox1.SelectionColor = Color.Blue
Next

答案 1 :(得分:1)

我认为这是因为lower_case_text.IndexOf(c.Value)仅在字符串中首先找到索引。

一个快速的技巧是在每个周期内更改lower_case_text

像:“使某物暗淡”

找到第一个昏暗的地方后,将其替换为“ 000”之类的长度

所以您的lower_case_text现在将是:“ 000某物使某物变暗”

然后您将能够获得第二个“暗淡”的有效索引

这不是一个很好的解决方案,但应该可以。

希望它会吸引人。

答案 2 :(得分:1)

首先,无需使用Captures集合(以及括号),因为Capture将具有与Match相同的值。其次,您可以在正则表达式模式的开头使用内联正则表达式选项(例如(?i)-设置不区分大小写的搜索)。内联选项的优点是您可以在模式的任何部分进行设置和取消设置(例如(?-i)-取消不区分大小写的搜索)。

Dim input = 
   "If i = 10 Then
        i = 0
    Else
        i = 5
    End If"
Dim pattern = "(?i)in|handles|object|sub|private|dim|as|then|else|end|if|regex"
Dim mc = Regex.Matches(input, pattern)
For Each m As Match In mc
    Dim index = m.Index
    Dim length = m.Length
Next