Исключить символ из захвата и получить только необходимые данные?

У меня есть текст с днями, часами, минутами в следующем формате:

4 d. 12 h. 32 m.
7 h. 22 m.
3 d. 14 h.

Обратите внимание, что некоторые из них могут отсутствовать (например: 3 d. 14 h. не содержит минут)

Я хочу захватывать цифры в именованных группах, но не записывать символы (dhm). Итак, наконец, мне нужно получить результат что-то вроде этой карты:

[
    'days' => 4,
    'hours' => 12,
    'minutes' => 32,
]

Это то, что я написал: (?P<days>(\d+) d.)?(?P<hours>(\d+) h.)?(?P<minutes>(\d+) m.)?

Ссылка: https://regex101.com/r/FERRnd/1

Но кажется, что есть некоторые пустые элементы, и я чувствую, что это не лучшее регулярное выражение для этой задачи. Есть ли способ получить только именованные параметры в виде цифр и ничего больше (нет пустых полей, нет текста, как 12 h. так далее.)?

Большое спасибо!

2 ответа

Решение

Пытаться:

(?:(?P<days>\d+) d.)?\s*(?:(?P<hours>\d+) h.)?\s*(?:(?P<minutes>\d+) m.)?

Решение akond работает, если вы согласны с соответствующей пустой строкой. Добавление положительного взгляда в начале предотвратит совпадение пустой строки:

(?=\d+\s[dhm]\.)(?:(?P<days>\d+) d.)?\s*(?:(?P<hours>\d+) h.)?\s*(?:(?P<minutes>\d+) m.)?
Другие вопросы по тегам