正则表达式多行模式无法按预期方式为可选组工作

时间:2017-01-23 14:32:39

标签: php regex phpunit preg-match-all pcre

我有下一个文字来源:

PHPUnit 5.7.5 by Sebastian Bergmann and contributors.

.....................E.....R.................................   61 / 1485 (  1%)
.....................                                         1485 / 1485 (100%)

Time: 1.51 minutes, Memory: 102.00MB

---error details skipped---

ERRORS!
Tests: 1485, Assertions: 14821, Errors: 1, Failures: 1.

我需要实时解析(流输出到stdout)下一个符号:EFWIRS.(错误,失败,警告等)和可用的统计行(EOL中的数字和百分比)。所以,在结果中我除了那样的东西:

.......

.....................E.....R.................................

.....................E.....R.................................   61 / 1485 (  1%)

.....................                                         1485 / 1485 (100%)

但不是

.....................E.....R.................................   61 / 1485 (

.....................E.....R.................................   61 / 1485 (  1

.....................E.....R.................................   61 /

我的正则表达式是/^[EFWIRS.]+\s*(?:\d+\s\/\s\d+\s\(\s*\d+%\)\n)?/m,但如果测试失败,它还匹配额外的ERR字符串(查看输出示例)。我尝试/^[EFWIRS.]+\s*(?:\d+\s\/\s\d+\s\(\s*\d+%\))?$/m,但这个正则表达式是完全不完整统计数据块的跳过行,并且只匹配整个字符串,尽管可选组(...)?,它在第一个正则表达式中按预期工作。

P.S。我知道PHPUnit的自定义打印机,但在我的情况下它们不适合我需要解析常见的输出。

2 个答案:

答案 0 :(得分:0)

我相信你必须使用先行来确保两个正确的字符匹配并纠正它们的结果。

我为你做了一个例子here。模式本身是^([EFWIRS.](?=[EFWIRS.\s]))+\s+(\d+\s*\/\s*\d+\s*\(\s*\d+%\s*\))?$我不确定你的输出捕获机制所以不能建议修饰符和PHP正则表达式函数使用。链接下面的示例假设完整的多行文本,因此它使用全局和多行修饰符(意味着preg_match_all#pattern#m将在php代码中使用。)

答案 1 :(得分:0)

如果您不需要统计部分,这个简单的正则表达式适用于所有提供的示例。

[.EFWIRS]+(?=\s+\d)

Link to the regex

在这种情况下,负面前瞻套件比非捕获组更好。

相关问题