我从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/,但它显示的匹配信息如下:
根据我的理解,我需要得到第二组,但我认为我需要一些提示或一些帮助来实现我的目标。
有帮助吗?提前致谢!
那这个呢:
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+\%(?=.*)
我看到的一个解决方案是使用一个正则表达式来捕获几行,从第一个“平均”开始到第二个结束。至于正则表达式中包含所有逻辑,您需要知道如何在正则表达式中指定搜索选项,这通常使用/sm
完成。最后你的正则表达式看起来像这样:
/^\| Average *\| \d*.\d+\%.*$.*^\| Average *\| (\d*.\d+\%).*$/sm
捕获的组仅包含Average
的Line
百分比的第二次出现。
最终,我通过反复试验得到了答案。
\| Average \| .*\d+\% +\| *(\d*.\d\%) +\| +\d
将数学分支下面的列。谢谢大家的帮助!