为什么我不能更改 RichTextBox 中重复单词的颜色?
Why can't I change the color of repeated words in a RichTextBox?
我的程序必须在 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
循环中,但我不确定。
我已经有几个版本了,但是 none 工作。
我认为那是因为 lower_case_text.IndexOf(c.Value)
只找到字符串中第一个匹配项的索引。
一个快速的破解方法是每个循环更改 lower_case_text
。
赞:"dim something dim something"
找到第一个 dim 后,将其替换为相同长度的内容,例如“000”
所以您的 lower_case_text
现在将是:“000 something dim something”
然后你就可以得到第二个的有效索引"dim"
这不是一个优雅的解决方案,但应该可行。
希望它成功了。
这个方法可以使用一些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
首先,不需要使用 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
我的程序必须在 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
循环中,但我不确定。
我已经有几个版本了,但是 none 工作。
我认为那是因为 lower_case_text.IndexOf(c.Value)
只找到字符串中第一个匹配项的索引。
一个快速的破解方法是每个循环更改 lower_case_text
。
赞:"dim something dim something"
找到第一个 dim 后,将其替换为相同长度的内容,例如“000”
所以您的 lower_case_text
现在将是:“000 something dim something”
然后你就可以得到第二个的有效索引"dim"
这不是一个优雅的解决方案,但应该可行。
希望它成功了。
这个方法可以使用一些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
首先,不需要使用 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