У меня есть следующий текстовый источник:
PHPUnit 5.7.5 от Себастьяна Бергмана и участников. ..................... E ..... R ...................... ........... 61/1485 (1%) 1485/1485 (100%) Время: 1,51 минуты, Память: 102,00 МБ --- информация об ошибке пропущена --- ОШИБКИ! Тесты: 1485, Утверждения: 14821, Ошибки: 1, Сбои: 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
(?:\ /^[EFWIRS.]+\s*(?:\d+\s\/\s\d+\s\(\s*\d+%\)\n)?/m
строка в случае, если тесты не удались (см. пример вывода). Я пытаюсь /^[ /^[EFWIRS.]+\s*(?:\d+\s\/\s\d+\s\(\s*\d+%\))?$/m
неполный блок статистики полностью и соответствует только цельной строке, несмотря на необязательную группу (...)?
, который работает в первом регулярном выражении, как ожидалось.
PS Я знаю о пользовательских принтерах для PHPUnit, но в моем случае они не подходят, и мне нужно разобрать общий вывод.
Я считаю, что вы должны использовать lookahead, чтобы гарантировать правильность символов, чтобы они соответствовали и исправляли последствия их в строке.
Я привел пример для вас здесь . Сам шаблон равен ^([EFWIRS.](?=[EFWIRS.\s]))+\s+(\d+\s*\/\s*\d+\s*\(\s*\d+%\s*\))?$
Я не уверен в вашем механизме захвата вывода, поэтому не могу советовать о модификаторах и какие функции PHP использовать повторно. Пример вниз по ссылке предполагает полный многострочный текст, поэтому он использует глобальные и многострочные модификаторы (это означает, что preg_match_all
и #pattern#m
будут использоваться в php-коде).
[.EFWIRS]+(?=\s+\d)
.
Ссылка на регулярное выражение
В этом случае более дешевые негативные сюжеты лучше, чем не захватывающие группы.