6

我对 Java 中的正则表达式有疑问,尽管我认为这也可能适用于其他语言。

我有一个正则表达式来解析用户可能输入类似4d 8h 42m. 当然,我想让它尽可能灵活,这样用户就不必输入所有数字(15h例如仅输入一个数字)。

关于这一点,我的正则表达式非常令人满意:(?:([\d]+)d)?[\s]*(?:([\d]+)h)?[\s]*(?:([\d]+)m)?

现在我的问题是它也会匹配一个空字符串,尽管我希望它确保至少一个时间单位被填充。

当前的解决方案是任意选择其中一个为强制性的,但我对此并不满意,因为我试图避免强制性字段。

另外,做一个不适合我,因为我必须在之后解析正则表达式时测试组,而不是仅仅访问 group(1) 几天, group(2) 几个小时,......(这就是我的想法of 当谈到or(?:([\d]+)d[\s]*(?:([\d]+)h)?[\s]*(?:([\d]+)m)?|(?:([\d]+)d)?[\s]*([\d]+)h[\s]*(?:([\d]+)m)?|(?:([\d]+)d)?[\s]*(?:([\d]+)h)?[\s]*([\d]+)m),被理解为强制天数或强制小时数或强制分钟数)。

那么我如何修改我的正则表达式以确保我现在非捕获组中的至少一个不为空,无论是几天、几小时还是几分钟?

4

2 回答 2

6

您可以使用前瞻断言来确保至少出现d hor之一m

(?=.*[mhd])(?:(\d+)d)?\s*(?:(\d+)h)?\s*(?:(\d+)m)?
于 2012-11-20T07:13:52.327 回答
2

正如 OmnipotentEntity 所建议的那样,您可以使用积极的前瞻来确定数字后面是否跟着ad或。mh

另一种写法可能是:

(\d+(?=[dhm])[dhm]\s*){1,3}

这将匹配以下内容:

4d 8h 42m
3d
15h
28m
12d 24m
2h 55m
7d  11h  24m
5d2h5m
于 2012-11-20T08:13:23.750 回答