Исключить символ из захвата и получить только необходимые данные?
У меня есть текст с днями, часами, минутами в следующем формате:
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.)?