从捕获中排除符号并仅获取所需数据?

Exclude symbol from capturing and get only required data?

我有包含天、小时、分钟的文本,格式如下:

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

注意,其中一些可能不存在(例如:3 d. 14 h. 不包含分钟)

我想捕获命名组中的数字,但不捕获字符 (d.h.m.)。所以最后我需要得到类似这张地图的结果:

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

这是我写的:(?P<days>(\d+) d.)?(?P<hours>(\d+) h.)?(?P<minutes>(\d+) m.)?

Link: https://regex101.com/r/FERRnd/1

但似乎有一些空元素,我觉得这不是完成此任务的最佳正则表达式。有什么方法可以只接收命名参数作为数字而不是其他任何东西(没有空字段,没有像 12 h. 等文本)?

非常感谢!

尝试:

(?:(?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.)?