Php 对于可选组,正则表达式多行模式未按预期工作

Php 对于可选组,正则表达式多行模式未按预期工作,php,regex,phpunit,preg-match-all,pcre,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,

我有一个下一个文本源:

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. 或

E….R。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 或

E….R。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。61 / 1485 ( 1%) 或

..................... 1485 / 1485 (100%) 但不是

.....................E.....R................................. 61 / 1485 ( 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
,但此正则表达式完全跳过统计数据块不完整的行,并仅匹配整个字符串,尽管可选组
(…)?
,如预期在第一个正则表达式中工作


另外,我知道PHPUnit的定制打印机,但在我的情况下,它们不适合,我需要解析公共输出。

我相信您必须使用前瞻功能来确保匹配的正确字符和它们在一行中的正确结果

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

如果您不需要统计部分,那么这个简单的正则表达式在所有提供的示例中都有效。
[.EFWIRS]+(?=\s+\d)


负前瞻在这种情况下比不捕获组更适合。在开始处添加点模式是否有帮助?否,因为字符串不仅可以从点开始:E、F、W、I、R、S字符也是可能的。那么如何区分好的模式和坏的模式呢?否
ERR
在开始处,应该匹配的字符串是放在两个空行之间:第一个在“PHPUnit 5.7…”之后,第二个在“Time…”之前。另外,第二个空行并不总是存在(正如我之前所说-这是流式输出)@Alex您也可以解析报告文件。只是说。不走运。正如我之前所说,regex也应该匹配“complete”字符串,如
..E..F..61/1485(4%
(EOL处无额外括号)或
..E..F..6
。如果在下线
61/1485处阻塞,两个不完整的字符串应匹配为
..E..F..
(4%
不完整。不起作用的示例:但也应该捕获统计部分,请查看“所以,在结果I中,除了类似的内容”后面的原始帖子。 .....................E.....R................................. .....................E.....R................................. 61 / 1485 ( 1%) ..................... 1485 / 1485 (100%) .....................E.....R................................. 61 / 1485 ( .....................E.....R................................. 61 / 1485 ( 1 .....................E.....R................................. 61 /