2016-01-27 29 views
3

我試圖在C#下面的代碼交互的Visual Studio正則表達式組不會返回預期值

> using System.Text.RegularExpressions; 
> var re = new Regex(@"(\d\d/\d\d?\/\d\d\d\d)"); 
> var r = re.Match("01/01/2016 02/02/2016").Groups; 
> r 
GroupCollection(2) { [01/01/2016], [01/01/2016] } 

的,爲什麼不返回預期[01/01/2016], [02/02/2016]

回答

2

它似乎包含第一個匹配兩次,因爲Groups[0]包含整個匹配的字符串,並且直到Groups[1],您定義的實際捕獲組纔會啓動。

你會看到更清楚與多個捕獲組:

> var re = new Regex(@"(\d)-([A-Z])"); 
> var r = re.Match("5-D").Groups; 

> r[0] 
{5-D} 
    [System.Text.RegularExpressions.Match]: {5-D} 
    base {System.Text.RegularExpressions.Capture}: {5-D} 
    Captures: {System.Text.RegularExpressions.CaptureCollection} 
    Success: true 
> r[1] 
{5} 
    base {System.Text.RegularExpressions.Capture}: {5} 
    Captures: {System.Text.RegularExpressions.CaptureCollection} 
    Success: true 
> r[2] 
{D} 
    base {System.Text.RegularExpressions.Capture}: {D} 
    Captures: {System.Text.RegularExpressions.CaptureCollection} 
    Success: true 

但是你想在你的情況做的是使用Regex.Matches

搜索指定的輸入字符串的所有出現正則表達式。

使用組名

爲了避免0基於索引的混亂,和其他混亂,命名組是有用的:

var re = new Regex(@"(?<date>\d\d/\d\d?\/\d\d\d\d)"); 
var dateGroup = re.Match("01/01/2016").Groups["date"]; 
+0

模式應該是'VAR重新=新的正則表達式(@「( \ d)「);'。 're.Match(「....」)。Groups仍然返回長度爲2的集合是非常具有誤導性的。 – ca9163d9

+0

我認爲我的示例現在更加清晰,現在兩個捕獲組完全不同。這是誤導,我同意。我傾向於使用命名組,請參閱我的編輯。 – weston