首页 > 解决方案 > 从第二行获取第二次出现

问题描述

我有来自dotnet test命令结果的下表,我想要实现的是第二次出现(在Branch下面的那些)以Average开头的行。

+---------+-----------+-----------+-----------+
|         | Line      | Branch    | Method    |
+---------+-----------+-----------+-----------+
| Total   | 100%      | 100%      | 100%      |
+---------+-----------+-----------+-----------+
| Average | 100%      | 100%      | 100%      | 
+---------+-----------+-----------+-----------+

+---------+-----------+-----------+-----------+
|         | Line      | Branch    | Method    |
+---------+-----------+-----------+-----------+
| Total   | 100%      | 100%      | 100%      |
+---------+-----------+-----------+-----------+
| Average | 100%      | 100%      | 100%      | 
+---------+-----------+-----------+-----------+

我已经设法编写了以下正则表达式^\| Average *\| (\d+.\d+\%).*$,但{2}在表达式中的任何位置添加仍然不会返回我第二次出现。此外,我尝试使用https://regex101.com/,但它显示的匹配信息如下:

Regex101.com 匹配信息

根据我的理解,我需要获得第二组,但我认为我需要提示或一点帮助才能达到我的目标。

有什么帮助吗?提前致谢!

标签: regexfind-occurrences

解决方案


那这个呢:

string table =
    "+---------+-----------+-----------+-----------+" + Environment.NewLine +
    "|         | Line      | Branch    | Method    |" + Environment.NewLine +
    "+---------+-----------+-----------+-----------+" + Environment.NewLine +
    "| Total   | 100%      | 100%      | 100%      |" + Environment.NewLine +
    "+---------+-----------+-----------+-----------+" + Environment.NewLine +
    "| Average | 100%      |  89%      | 100%      |" + Environment.NewLine +
    "+---------+-----------+-----------+-----------+" + Environment.NewLine +
    "" + Environment.NewLine +
    "+---------+-----------+-----------+-----------+" + Environment.NewLine +
    "|         | Line      | Branch    | Method    |" + Environment.NewLine +
    "+---------+-----------+-----------+-----------+" + Environment.NewLine +
    "| Total   | 100%      | 100%      | 100%      |" + Environment.NewLine +
    "+---------+-----------+-----------+-----------+" + Environment.NewLine +
    "| Average | 100%      | 99%       | 100%      |" + Environment.NewLine +
    "+---------+-----------+-----------+-----------+";

MatchCollection matches = Regex.Matches(table, @"(?<=\| Average *\| \d+\% +\| *)\d+\%(?=.*)");

foreach (Match m in matches)
{
    Console.WriteLine(m.Value);
}

输出:

89%
99%

更新:

我必须发现 .NET(我构建 RegEx 的地方)支持环视表达式中的量词,而其他 RegEx 实现缺乏这种支持。

因此,我的解决方案的 RegEx 表达式不会在那里运行。

为了解决这个问题,我删除了量词并用固定的字符声明替换它们。这适用于固定表格,但如果表格的布局在其宽度上是动态的,则将不起作用:

(?<=\| Average \| ..\d\%      \| )\d+\%(?=.*)

推荐阅读