2016-07-02 114 views
0

我用正則表達式選項查找並替換對話框。有一個按鈕來測試一個正則表達式,突出顯示所有匹配項,以及一個按鈕來查找單個匹配項。對於一些正則表達式,兩種方法都會進行相同的匹配其他正則表達式與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呢?

+2

答案很可能是您的*(*)的重複*([0-9]:+)*'可以匹配空字符串。使用Regex.Matches,這是沒有問題的,因爲此方法將掃描每個位置在字符串和正則表達式。匹配,如果在開始時沒有與可選模式相匹配的文本,則匹配字符串的開頭;如果匹配字符串開頭的文本匹配可選模式,則匹配返回匹配。解決方案是修改模式以匹配非空字符串。 –

回答

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 

...但有一個產量很多

這並不完全清楚你想匹配什麼,但你可能想確保空字符串匹配你的正則表達式。

+0

所以它正在進行比賽。我只是沒有點擊查找按鈕就足以看到它。這裏的獎金課是使用控制檯查看實際匹配,而不是依賴RichTextBox中的視覺更改。謝謝。 – codingcoding

+0

@codingcoding:我發現在大多數情況下,快速控制檯應用程序是一種非常有效的調試方式。沒有用戶界面的方式,只需要你需要的代碼:) –

相關問題