正则表达式正在查找匹配项,但如果仅匹配一次,则不计数

时间:2019-04-14 14:23:46

标签: regex vb.net match

我写了一些代码,用户将在文本框中输入单词或句子,单击一个按钮,然后在富文本框中搜索文本,如果找到则删除搜索的文本。这样可行。 还应该发生的是,将弹出一个消息框,提示“短语已被删除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 :(得分:0)

这是因为您正在搜索vbLf。也就是说,您正在寻找两个vbCrLf,但是第一行将不会以换行符开头,并且行之间可能会以^隔开。您可以将行首与$匹配,并将行尾与RichTextBox1匹配。

此外,我不确定您的意图是什么。由于deletion.Matches(RichTextBox1.Text)包含剥离的文本,即不再包含搜索模式的文本,因此如何使用Regex在其中查找该文本?

您要声明一个名为Selection的{​​{1}},但是您永远不会这样使用它。取而代之的是,您使用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\."