0

给定一个简单的正则表达式,如下所示:^(\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 查看整个模式而不是其组。现在如何获得小组比赛

4

1 回答 1

1

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

  • 正则表达式的^开头是字符串开头的锚点,因此您需要删除它,否则您的正则表达式只能在索引 0 处匹配。
  • .*则表达式末尾的 将匹配字符串的其余部分,并且您不会找到任何重叠的匹配项,因此您只能匹配一次。由于无论如何您都没有对第二个捕获组执行任何操作,因此您可能可以将其从您的正则表达式中删除。

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

于 2012-09-21T21:10:15.950 回答