如何获取dotnet test结果中第二组Average行的Branch列值?
解决dotnet test表格中提取第二个Average行Branch值的问题
看起来你在处理dotnet test的代码覆盖率输出表格时,混淆了捕获组和匹配结果的概念,同时正则的捕获位置也没对准目标列。我来一步步帮你解决:
1. 先修正正则,捕获Branch列的值
你当前的正则^\| Average *\| (\d+.\d+\%).*$捕获的是Line列(第二列)的内容,但你要的是Branch列(第三列)。调整正则,跳过第二列的内容,捕获第三列:
^\| Average\s*\|\s*\d+\.\d+\%\s*\|\s*(\d+\.\d+\%)\s*\|\s*.*$
\s*:匹配任意数量的空格(适配表格里的对齐空格)\.:转义小数点(避免正则里的.匹配任意字符)- 捕获组
(\d+\.\d+\%):精准匹配Branch列的百分比值
2. 获取第二个匹配结果(而非第二个捕获组)
你的表格有两个独立的表格块,每个块都有一行Average,所以你需要的是第二个匹配到的结果,而不是正则里的第二个捕获组。不同工具的实现方式不同:
用.NET代码处理(C#)
如果是用C#解析输出,可以用Regex.Matches()获取所有匹配,然后取索引为1的结果(因为匹配集合从0开始计数):
var output = File.ReadAllText("test_output.txt"); var regex = new Regex(@"^\| Average\s*\|\s*\d+\.\d+\%\s*\|\s*(\d+\.\d+\%)\s*\|\s*.*$", RegexOptions.Multiline); var matches = regex.Matches(output); if (matches.Count >= 2) { string branchCoverage = matches[1].Groups[1].Value; Console.WriteLine(branchCoverage); // 输出第二个表格的Average行Branch值 }
用命令行工具(awk,更适合结构化表格)
正则处理表格容易受格式变动影响,用awk处理结构化表格更稳定:
awk '/^\+---------\+-----------\+-----------\+-----------\+$/ {table_count++} table_count == 2 && /^| Average / {print $4}' test_output.txt
- 每遇到表格的分隔线,
table_count加1,标记进入新表格 - 当
table_count == 2(第二个表格),且行包含Average时,打印第4个字段(对应Branch列)
你之前的误区
你提到添加{2}和想获取第二个分组,其实是混淆了两个概念:
{2}是正则的量词,用来匹配前面的模式2次,不是获取第二个匹配结果- 你需要的是第二个匹配到的行,而不是正则表达式里的第二个捕获组
内容的提问来源于stack exchange,提问作者Vladel
相关产品推荐
相关产品推荐

