【问题标题】:iterate matches in unnamed groups在未命名的组中迭代匹配
【发布时间】:2012-09-21 21:00:14
【问题描述】:

给定一个像这样的简单正则表达式:^(\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 查看整个模式而不是其组。现在如何获得组匹配

【问题讨论】:

  • 请编辑您的问题并将此信息添加到其中。在 cmets 中无法读取源代码。
  • 已根据要求将评论移至发布。

标签: .net regex asp.net-4.0


【解决方案1】:

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

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

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

【讨论】:

  • 关于正则表达式它“有效”,但没有报告第二次捕获。我只是将 1 美元括起来,然后显示 2 美元。我知道它捕获了它们,Matches() 没有同时报告它们,我不明白为什么。
  • 您混淆了组和匹配项。组是这样的括号之间的东西(组)。匹配是适合整个正则表达式的东西。当然有一些方法可以在其中任何一个中不包含匹配字符串的部分。
  • 我怎样才能得到这些匹配?我是否必须对正则表达式进行正则表达式并为每个组运行单独的调用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 2011-12-16
  • 2011-12-28
  • 2021-12-22
  • 2014-12-25
  • 2014-03-19
相关资源
最近更新 更多