我不理解正则表达式中的可选组语法

I'm not understanding the optional group syntax in regex

这是我的测试string/phrase/text ...

8:58 pm uberX 32m 0s 13.87

持续时间可以是天、小时、分钟和秒。我可能永远不会看到几天,但几个小时是可能的。

(\d+)m.(\d+)s

在这种情况下,在 php preg_match 语句中给我 32 和 0。

现在我尝试输入 (\d+)h?。在上面的正则表达式前面,在我的测试字符串中放了一个 2h,我把它弄坏了。

正在尝试一点一点地学习正则表达式。

我很感激任何帮助我的方式! 谢谢!

/(\d+(?=d\W))|(\d+(?=h\W))|(\d+(?=m\W))|(\d+(?=s\W))/

这使用正先行仅匹配紧跟 d、h、m 或 s 的数字

那个?适用于紧接在它之前的标记。在您的示例中,它使 h 可选,但数字仍然是必需的。您可以通过将整个部分包含在非捕获组中以使其成为可选来完成这项工作:(?:(\d+)h)?