我用正則表達式選項查找並替換對話框。有一個按鈕來測試一個正則表達式,突出顯示所有匹配項,以及一個按鈕來查找單個匹配項。對於一些正則表達式,兩種方法都會進行相同的匹配其他正則表達式與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,這是沒有問題的,因爲此方法將掃描每個位置在字符串和正則表達式。匹配,如果在開始時沒有與可選模式相匹配的文本,則匹配字符串的開頭;如果匹配字符串開頭的文本匹配可選模式,則匹配返回匹配。解決方案是修改模式以匹配非空字符串。 –