Regex:单独可选的捕获组,但总体上必须至少存在一个

Regex:单独可选的捕获组,但总体上必须至少存在一个,regex,Regex,我已经用多个正则表达式实现了这一点,但我想知道是否可以用一个正则表达式实现 我有一些表示持续时间的字符串。这些字符串的格式以“4d10h30m”为例,表示持续时间为四天十小时三十分钟。持续时间(天、小时或分钟)中的每个单位都是可选的,因此“4d”和“10h30m”都是有效字符串 我想要的是一个regex(javascript,如果需要的话),它可靠地返回三个捕获组,每个捕获组包含一个单位的值。因此,在“4d10h30m”示例中,将正则表达式与该字符串匹配应返回[“4”、“10”、“30”]。如果

我已经用多个正则表达式实现了这一点,但我想知道是否可以用一个正则表达式实现

我有一些表示持续时间的字符串。这些字符串的格式以“4d10h30m”为例,表示持续时间为四天十小时三十分钟。持续时间(天、小时或分钟)中的每个单位都是可选的,因此“4d”和“10h30m”都是有效字符串

我想要的是一个regex(javascript,如果需要的话),它可靠地返回三个捕获组,每个捕获组包含一个单位的值。因此,在“4d10h30m”示例中,将正则表达式与该字符串匹配应返回[“4”、“10”、“30”]。如果该单元丢失,那么它在元组中的位置可以包含几乎任何非零整数(0、“0”、null或空字符串都可以)

我考虑的两种方法如下:

/(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m)?/
与空字符串匹配的;和一些变化:

/((?:\d+[dhm]){1,3})/
这使得仅捕获\d+非常困难,并且将返回数量不确定的捕获组

我怀疑后者是不可能的。如果有一个regex构造指定“这些组中的任何一个单独是可选的,但总的来说,至少有一个必须存在”,那么前者将起作用?在细胞自动机的限制下,这似乎是可行的,但我不知道它将如何在正则表达式中实现,甚至不知道它是否可以实现

编辑:

根据要求,一些示例输入及其输出:

2d1h5m # ["2","1","5"]
3h20m  # ["", "3", "20"]
4d10m  # ["4", "", "10"]
2d     # ["2", "", ""]
6h     # ["", "6", ""]
1x20y  # no match (invalid units)
2dh20m # no match (no units allowed without a value)
21020  # no match (no units)
1h2d5m # no match (disordered units)
xd5m   # no match (non-numeral value)

下面的正则表达式将捕获输入字符串中是否存在的数字
dhm

(\d)d?(\d{2})h?(\d{2})m?

在正则表达式中添加一个锚定的负前瞻,以断言有一些输入:

表达式
(?!$)
表示“此点后不得有输入结束”,当锚定到输入开始时
^(?!$)
表示“开始后不得有结束”,这与表示“必须有一些输入”相同

使用锚定前瞻是一种为正则表达式断言输入总长度的简便方法,否则将断言输入的格式


用你的样例输入来查看这个正则表达式,包括空白输入,显示正确组中的单元的捕获,而不匹配空白输入。

你能用第一个然后只检查一个空字符串吗?我可以,但是我需要一个单独的正则表达式来验证格式,因为第一个匹配任何字符串。这或多或少是我在实践中所做的,但我很好奇是否有可能在同一个正则表达式中同时匹配和捕获有效字符串。是否会完全丢失一个单元?例如4d5m?或者它们都在,但没有数字,例如4d0h5m或4dxh5m?更好的是,你能提供有效的输入样本,并展示3组中每个组应该捕获的内容吗?我在问题的主体部分添加了一些输入和输出示例,这些示例应该可以回答这些问题。
^(?!$)(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m)?$