从第二行获得第二次出现

问题描述 投票:0回答:3

我从dotnet test命令结果中得到了以下表格,我想要实现的是获得以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 Match Information

根据我的理解,我需要得到第二组,但我认为我需要一些提示或一些帮助来实现我的目标。

有帮助吗?提前致谢!

regex find-occurrences
3个回答
1
投票

那这个呢:

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+\%(?=.*)

0
投票

我看到的一个解决方案是使用一个正则表达式来捕获几行,从第一个“平均”开始到第二个结束。至于正则表达式中包含所有逻辑,您需要知道如何在正则表达式中指定搜索选项,这通常使用/sm完成。最后你的正则表达式看起来像这样:

/^\| Average *\| \d*.\d+\%.*$.*^\| Average *\| (\d*.\d+\%).*$/sm

捕获的组仅包含AverageLine百分比的第二次出现。


0
投票

最终,我通过反复试验得到了答案。

\| Average \| .*\d+\% +\| *(\d*.\d\%) +\| +\d

将数学分支下面的列。谢谢大家的帮助!

© www.soinside.com 2019 - 2024. All rights reserved.