Почему я не могу изменить цвет повторяющихся слов в RichTextBox? - PullRequest
0 голосов
/ 08 декабря 2018

Моя программа должна найти определенные слова внутри 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 голосов
/ 08 декабря 2018

Этот метод может быть упрощен с использованием некоторых 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
0 голосов
/ 08 декабря 2018

Во-первых, нет необходимости использовать Captures collection (а также круглые скобки), поскольку 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
0 голосов
/ 08 декабря 2018

Я думаю, это потому, что lower_case_text.IndexOf(c.Value) находит индекс только первое совпадение в строке.

Быстрый взлом состоит в том, чтобы изменить lower_case_text каждые для цикла.

Как: "dim что-то dimчто-то "

Найдя первое затемнение, замените его на что-нибудь такой же длины, как" 000 "

Так что ваш lower_case_text теперь будет:" 000 что-то тусклое что-то "

И тогда вы сможете получить действительный индекс 2-й "дим"

Это не элегантное решение, но должно работать.

Надеюсь, что это сделал сеанс.

...