Regex находит совпадение, но не считает, если совпадение встречается - PullRequest
0 голосов
/ 14 апреля 2019

Я написал небольшой фрагмент кода, в котором пользователь напишет слово или предложение в текстовом поле, нажмет кнопку, и текст в поле расширенного текста будет найден, удаляя искомый текст, если он найден. Это работает. Также должно произойти, что появится окно с сообщением «Фраза была удалена X раз». У меня проблема в том, что это работает, только если найдено несколько раз. Если он найден один раз, моя программа, кажется, видит его как найденный 0 раз. Код ниже, любая помощь будет высоко ценится -

Try
    Dim Selection As New Regex(TextBox1.Text)
    Dim deletion As New Regex("\n" & Selection.ToString & "\n")

    Dim Stripped As String = Regex.Replace(RichTextBox1.Text, deletion.ToString, vbCr, RegexOptions.Multiline)
    RichTextBox1.Clear()
    RichTextBox1.AppendText(Stripped)

    Dim matchcount = deletion.Matches(RichTextBox1.Text).Count
    If matchcount > 0 Then
        MsgBox("'" & Selection.ToString & "'" & " has been deleted " & matchcount.ToString & " times.")
    Else
        MsgBox("'" & Selection.ToString & "'" & " has not been found on a line on its own.")
    End If

1 Ответ

0 голосов
/ 14 апреля 2019

Это потому, что вы ищете \n something \n.То есть вы ищете два vbLf, но перед первой строкой не будет перевода строки, и строки могут быть разделены vbCrLf.Вы можете сопоставить начало строки с ^ и конец строки с $.

Кроме того, я не уверен, каково ваше намерение.Поскольку RichTextBox1 содержит разделенный текст, т. Е. Текст, который больше не содержит шаблон поиска, как вы можете найти в нем этот текст с помощью deletion.Matches(RichTextBox1.Text)?

Вы объявляете Regex с именем Selectionно вы никогда не используете его как таковой.Вместо этого вы извлекаете шаблон с помощью Selection.ToString, который, конечно, в точности совпадает с тем, который вы ввели как TextBox1.Text.

. Вы должны посчитать совпадения перед выполнением замены.Кроме того, вы должны использовать те же опции для подсчета и замены

Dim deletion As New Regex("^" & TextBox1.Text & "$", RegexOptions.Multiline)

Dim matchcount = deletion.Matches(RichTextBox1.Text).Count
RichTextBox1.Text = deletion.Replace(RichTextBox1.Text, vbCrLf)

Если TextBox1.Text должен содержать шаблон регулярного выражения, то создание такого объекта Regex, как это, хорошо;тем не менее, если предполагается, что он содержит простой текст, вы должны его избежать.

Dim deletion As New Regex("^" & Regex.Escape(TextBox1.Text) & "$", 
    RegexOptions.Multiline)

В противном случае специальные символы регулярного выражения будут выполнять свою магию, а не рассматриваться как простой текст.Пример

Regex.Escape("This is a sentence.")   --->   "This is a sentence\."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...