我使用正则表达式选项进行了查找和替换对话框。有一个按钮来测试正则表达式,突出显示所有匹配项,以及一个用于查找单个匹配项的按钮。使用一些正则表达式,两种方法都会进行相同的匹其他正则表达式与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
呢?
答案 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
...但是输出的很多。
您尝试匹配的内容并不完全清楚,但您可能希望确保空字符串不与正则表达式匹配。