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

问题描述 投票:0回答:3

我的程序必须在 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
循环中,但我不确定。
我已经有它的几个版本,但没有一个有效。

.net regex vb.net winforms richtextbox
3个回答
7
投票

可以使用一些RegexOptions

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

RegexOptions.Compiled

如果文本很长,则很有用(以较慢的启动速度为代价加快执行速度)。

RegexOptions.IgnoreCase

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

RegexOptions.CultureInvariant

有需要的时候可以补充。

有关更多信息,请参阅正则表达式选项文档。
另外,如果模式的某些部分可能包含一些元字符,请参阅 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
投票

我认为这是因为

lower_case_text.IndexOf(c.Value)
只找到字符串中的第一个匹配项。

一个快速的技巧是在每个 for 循环中更改

lower_case_text

比如:“调暗一些东西,调暗一些东西”

找到第一个暗淡后,将其替换为相同长度的内容,例如“000”

所以你的

lower_case_text
现在将是:“000 一些暗淡的东西”

然后你将能够获得第二个“dim”的有效索引

这不是一个优雅的解决方案,但应该可行。

希望它能成功。


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
© www.soinside.com 2019 - 2024. All rights reserved.