迭代未命名组中的匹配项

时间:2012-09-21 21:00:15

标签: .net regex asp.net-4.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显示为匹配项。但真的有2场比赛。我怎样才能得到两场比赛?我应该看到索引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: 

这表明Matches会查看整个模式而不是其组。现在如何获得小组赛

1 个答案:

答案 0 :(得分:1)

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

  • 正则表达式开头的^是字符串开头的锚点,所以你需要删除它,否则你的正则表达式只能匹配索引0。
  • 正则表达式末尾的.*将与字符串的其余部分匹配,您将找不到任何重叠匹配,因此您只能匹配一次。既然你没有对第二个捕获组做任何事情,你可以从你的正则表达式中删除它。

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