我用正则表达式选项查找并替换对话框。有一个按钮来测试一个正则表达式,突出显示所有匹配项,以及一个按钮来查找单个匹配项。对于一些正则表达式,两种方法都会进行相同的匹配其他正则表达式与Regex.Match
不匹配,但按照预期收集Regex.Matches
。我在分配正则表达式时尝试了不同的RegexOptions
,但没有找到任何使其表现符合要求的选项。为什么Regex.Match与Regex.Matches不匹配相同的字符串?
这里的目标是能够使用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个重复的:其余
的上面的代码将匹配除“余数”之外的所有文本ButtonTestRegex_Click()
(如预期)。没有什么会与ButtonFind_Click()
匹配。代码正在执行,它可以用于一些正则表达式,例如[0-9]
。
为清楚起见,此代码示例缩写。我的问题是,为什么Regex.Match
在这种情况下不匹配任何东西,但Regex.Matches
呢?
答案很可能是您的*(*)的重复*([0-9]:+)*'可以匹配空字符串。使用Regex.Matches,这是没有问题的,因为此方法将扫描每个位置在字符串和正则表达式。匹配,如果在开始时没有与可选模式相匹配的文本,则匹配字符串的开头;如果匹配字符串开头的文本匹配可选模式,则匹配返回匹配。解决方案是修改模式以匹配非空字符串。 –