我已经用多个正则表达式实现了这一点,但是我想知道是否可以用一个正则表达式来实现。
我有一些表示持续时间的字符串。这些字符串的格式为“ 4d10h30m”,表示持续时间为四天,十小时和三十分钟。持续时间(天,小时或分钟)中的每个单位都是可选的,因此“ 4d”是有效字符串,“ 10h30m”也是有效字符串。
我想要的是一个正则表达式(JavaScript,如果有关系的话),它可以可靠地返回三个捕获组,每个捕获组包含一个单位的值。因此,在“ 4d10h30m”示例中,将正则表达式与此字符串匹配应返回[“ 4”,“ 10”,“ 30”]。如果缺少该单位,则它在元组中的位置可以包含几乎所有非零整数(0,“ 0”,null或空字符串都可以)。
我考虑过的两种方法如下:
/(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m)?/
Run Code Online (Sandbox Code Playgroud)
匹配空字符串;和以下内容的一些变化:
/((?:\d+[dhm]){1,3})/
Run Code Online (Sandbox Code Playgroud)
这使得仅捕获\ d +很尴尬,并且将返回不确定数量的捕获组。
我怀疑后者不是入门者。如果有一个正则表达式构造指定“这些组中的任何一个都是单独可选的,但总的来说,必须至少存在其中一个”,那么前者将起作用。在细胞自动机的限制下,这似乎是可行的,但我不知道它如何在正则表达式中实现,甚至可能实现。
编辑:
根据要求,提供一些示例输入及其输出:
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)
Run Code Online (Sandbox Code Playgroud)
向您的正则表达式添加锚定的否定前瞻,以断言存在一些输入:
^(?!$)(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m)?$
Run Code Online (Sandbox Code Playgroud)
该表达式的(?!$)
意思是“该点一定不能跟随输入的终点”,而当锚定到输入的起点时,则^(?!$)
意味着“不能跟随终点的起点”,这与说“必须有一定的输入”相同。 。
使用锚定的前瞻是为正则表达式断言输入总长度的一种便捷方法,否则就可以断言输入格式。
使用您的样本输入查看此正则表达式的实时演示,其中包括空白输入,显示正确组中单位的捕获,但不匹配空白输入。