2012-09-21 38 views
0

给出如下所示的简单RegEx:^(\d+\D+\d+)(.*)和一个字符串解析为15-APR-2012 @ 11:00:00使用替换[$1]$2产生[15-APR-2012] @ 11:00:00预期。未命名组中的迭代匹配

我的问题是,当在这个上调用Regex.Matches我收到索引0处的一个匹配,并且整个字符串:15-APR-2012 @ 11:00:00显示为匹配。但是真的有两场比赛。我怎样才能得到两场比赛?我应该看到索引0和索引12.我正在使用的代码是从另一个线程SO:

// Get a collection of matches. 
MatchCollection matches = Regex.Matches(inPutString, regexptrn); 
foreach (Match match in matches) 
{ 
    foreach (Capture capture in match.Captures) 
     { 
      retVal += String.Format("Index={0}, Value={1}", capture.Index, capture.Value) + Environment.NewLine; 
     } 
} 

我是否有什么.Matches错误的想法()真的呢?


好的。这是一个后续相同的字符串,新的正则表达式 “(..)(...)” 与[$ 1] {$ 2}结果替换 [10] { - } AU [G - ] {201} [2] { @ 1} [1:] {45:} 38我们期待这一点。然而

比赛给出了这样的:

Index=0, Value=10-AU 
Index=5, Value=G-201 
Index=10, Value=2 @ 1 
Index=15, Value=1:45: 

这表明匹配着眼于整个图案而不是它的群体。现在,如何获得小组赛

+0

请编辑您的问题,此信息添加到它。在评论中阅读源代码是不可能的。发布 –

+0

感动评论的要求。 –

回答

1

有两个原因当前的正则表达式永远无法得到多个匹配:

  • ^在你的正则表达式的开头是锚定到字符串的开头,所以您需要删除该否则你正则表达式只能匹配索引0
  • .*在你的正则表达式将匹配字符串的其余部分的结束,你不会找到任何匹配重叠,所以你只能匹配一次。既然你不是在做与第二撷取类的话,无论如何,你可能只是从你的正则表达式下降这一点。

...所以请尝试使用正则表达式(\d+\D+\d+)并用[$1]替换匹配项。

+0

关于正则表达式是“作品”,但第二撷取不报。我只是$ 1,然后显示$ 2。我知道它捕获他们,匹配()不报告他们两个,我不明白为什么。 –

+1

你在混淆组和匹配。一个组是像这个(组)之间的括号之间的东西。匹配是适合整个正则表达式的东西。当然,在其中任何一个中都没有包含匹配字符串的部分的方法。 –

+0

我如何获得这些比赛?我是否需要对正则表达式进行regex并为每个组运行单独的调用? –