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

vhmi4jdf  于 2023-10-23  发布在  其他
关注(0)|答案(3)|浏览(117)

我的程序必须在RichTextBox中找到特定的单词并改变它们的颜色(简单的语法高亮)。我用Regex来查找单词。
我能够找到它们,但如果我的文本包含两个或更多的相同的单词,我只能改变第一个的颜色,其他的保持不变。

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循环中,但我不确定。
我已经有几个版本了,但都不起作用。

b1uwtaje

b1uwtaje1#

这个方法可以用一些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
axkjgtzd

axkjgtzd2#

我认为这是因为lower_case_text.IndexOf(c.Value)只在字符串中找到第一个匹配的索引。
一个快速的黑客将改变lower_case_text每一个周期。
就像:“dim something dim something”
找到第一个dim后,将其替换为类似“000”的长度
所以你的lower_case_text现在是:“000个模糊的东西”
然后你就可以得到有效的索引第二“暗淡”
这不是一个优雅的解决方案,但应该工作。
希望它能降神会。

pbossiut

pbossiut3#

首先,没有必要使用Captures集合(以及括号),因为Capture将与Match保存相同的值。其次,可以在正则表达式模式的开头使用内联正则表达式选项(例如(?i)- set case-sensitive search)。内联选项的优点是,您可以在模式的任何部分设置和取消它们(例如(?-i)- cancel case-insensitive search)。

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

相关问题