为什么Regex.Match与Regex.Matches不匹配相同的字符串?

时间:2016-07-02 07:00:57

标签: .net regex vb.net

我使用正则表达式选项进行了查找和替换对话框。有一个按钮来测试正则表达式,突出显示所有匹配项,以及一个用于查找单个匹配项的按钮。使用一些正则表达式,两种方法都会进行相同的匹其他正则表达式与Regex.Match不匹配,但与Regex.Matches集合的行为符合预期。我在分配正则表达式时尝试了不同的RegexOptions,但没有找到使其按预期运行的任何选项。

此处的目标是能够使用ButtonTestRegex测试正则表达式,然后能够使用“查找”或“替换”按钮选择每个匹配项。

Public rtb as RichTextBox

Private Sub ButtonTestRegex_Click(sender As Object, e As EventArgs)
    rtb.Select(0, rtb.TextLength)
    rtb.SelectionColor = Color.Black

    Dim rgx As New Regex("(duplicate of )*([0-9]:+)*")

    Dim matches As MatchCollection = rgx.Matches(rtb.Text)
    For Each match In matches
        rtb.Select(match.index, match.length)
        rtb.SelectionColor = Color.Red
    Next
End Sub

Private Sub ButtonFind_Click(ByVal sender As Object, ByVal e As EventArgs)
    rtb.Focus()
    rtb.selectionstart = 0
    rtb.selectionlength = 0
    Dim rgx = New Regex("(duplicate of )*([0-9]:+)*")
    Dim match As Match = rgx.Match(rtb.Text)
    If match.Value <> "" Then
        rtb.SelectionStart = match.Index
        rtb.SelectionLength = match.Length
     End If
End Sub

使用包含以下内容的RichTextBox:

  

1:余量

     

重复1:余数

     

重复1:余数

上面的代码会将除“rest”之外的所有文本与ButtonTestRegex_Click()匹配(如预期的那样)。什么都不会与ButtonFind_Click()匹配。代码正在执行,它确实适用于某些正则表达式,例如[0-9]

为清楚起见,此代码示例已缩写。我的问题是,为什么Regex.Match在这种情况下不匹配,Regex.Matches呢?

1 个答案:

答案 0 :(得分:1)

我怀疑您RichTextBox所选文字的开头有空格或其他内容。那时,它完全有道理。看看你的正则表达式:

(duplicate of )*([0-9]:+)*

这将匹配空字符串。例如,如果您找到针对"x"的所有匹配项,则会在x之前找到一个匹配项,在x之后找到一个匹配项。

当您致电Match时,会找到第一个匹配 - 它成功完成,但匹配空字符串。当您致电Matches时,它会检索所有匹配项 - 并且有很多匹配项。这是一个小型C#控制台应用程序,可以显示所有内容,假设文本开头有空格:

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main(string[] args)
    {
        var regex = new Regex("(duplicate of )*([0-9]:+)*");
        var input = @" 1:remainder
duplicate of 1:remainder
duplicate of duplicate of 1:remainder";
        foreach (Match match in regex.Matches(input))
        {
            Console.WriteLine(match.Length);
        }
    }
}

输出结果如下:

0
2
0
0
0
0
0
0
0
0
0
0
0
15
0

...但是输出的很多

您尝试匹配的内容并不完全清楚,但您可能希望确保空字符串与正则表达式匹配。