Объединение двух шаблонов регулярных выражений в один - PullRequest
1 голос
/ 01 апреля 2020

Я написал 2 оператора preg_match для извлечения TN, типа и расширения из дампа журнала. Есть ли способ объединить 2 оператора preg_match в один и при этом получить правильное извлечение?

preg_match("/(\d{3} \d \d{2} \d{2})   (\w{3,}).+(\d{4,}+)$/", $newstr, $match_array, PREG_OFFSET_CAPTURE, 29);
if (empty($match_array))
   preg_match("/(\d{3} \d \d{2} \d{2})   (\w{3,})/", $newstr, $match_array, PREG_OFFSET_CAPTURE, 29);

Я попытался это сделать, и это не сработало

preg_match("/(\d{3} \d \d{2} \d{2})   (\w{3,}).+(\d{4,}+)$|(\d{3} \d \d{2} \d{2})   (\w{3,})/", $newstr, $match_array, PREG_OFFSET_CAPTURE, 29);

Содержимое файла данных:

1140E     19 SEP 2018   00   252 1 11 05   1140                         8D  4090
1140E     19 SEP 2018   00   252 1 11 06   1140                         8D  
1140E      4 SEP 2019   00   252 1 11 07   1140                         8D  5592

Совпадения:

252 1 11 05, 1140, 4090
252 1 11 06, 1140
252 1 11 07, 1140, 5592

1 Ответ

1 голос
/ 01 апреля 2020

Вы можете сделать последнюю группу захвата в своем исходном регулярном выражении необязательной и изменить .+ перед ним на .+?, чтобы сделать его ленивым, чтобы регулярное выражение все равно захватывало последние цифры, если они присутствуют. Например:

$strings = [
    '1140E     19 SEP 2018   00   252 1 11 05   1140                         8D  4090',
    '1140E     19 SEP 2018   00   252 1 11 06   1140                         8D  ',
    '1140E      4 SEP 2019   00   252 1 11 07   1140                         8D  5592'
];

foreach ($strings as $str) {
    preg_match('/(\d{3} \d \d{2} \d{2})   (\w{3,}).+?(\d{4,})?$/', $str, $matches);
    print_r($matches);
}

Вывод:

Array
(
    [0] => 252 1 11 05   1140                         8D  4090
    [1] => 252 1 11 05
    [2] => 1140
    [3] => 4090
)
Array
(
    [0] => 252 1 11 06   1140                         8D  
    [1] => 252 1 11 06
    [2] => 1140
)
Array
(
    [0] => 252 1 11 07   1140                         8D  5592
    [1] => 252 1 11 07
    [2] => 1140
    [3] => 5592
)

Демонстрация на 3v4l.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...