我对Java中的正则表达式有疑问,不过我认为这也适用于其他语言。
我有一个正则表达式来解析用户可能输入4d 8h 42m
之类的字段的时间。当然,我希望尽可能灵活,这样用户就不必被迫输入所有数字(例如输入15h
仅仅是{。}}。
关于这一点,我的正则表达式非常令人满意:(?:([\d]+)d)?[\s]*(?:([\d]+)h)?[\s]*(?:([\d]+)m)?
现在我的问题是它也会匹配一个空字符串,但我希望它能确保至少填充一个时间单位。
目前的解决方案是任意选择其中一个是强制性的,但我对此不满意,因为强制性字段是我试图避免的。
此外,制作或并不适合我,因为我必须在之后解析正则表达式时测试组,而不是仅仅访问组(1)几天,组(2)几小时,...
(这是我在谈到或:(?:([\d]+)d[\s]*(?:([\d]+)h)?[\s]*(?:([\d]+)m)?|(?:([\d]+)d)?[\s]*([\d]+)h[\s]*(?:([\d]+)m)?|(?:([\d]+)d)?[\s]*(?:([\d]+)h)?[\s]*([\d]+)m)
时的想法,被理解为天强制性或强制性小时或强制性分钟。
那么我怎么能修改我的正则表达式以确保我现在非捕获组中的至少一个不是空的,无论是天,小时还是分钟?
答案 0 :(得分:6)
您可以使用前瞻断言来确保至少出现d
h
或m
中的一个。
(?=.*[mhd])(?:(\d+)d)?\s*(?:(\d+)h)?\s*(?:(\d+)m)?
答案 1 :(得分:2)
正如万能专家建议的那样,您可以使用积极的预测来确定数字是否跟随d
,m
或h
。
另一种写作方式可能是:
(\d+(?=[dhm])[dhm]\s*){1,3}
这将匹配以下内容:
4d 8h 42m
3d
15h
28m
12d 24m
2h 55m
7d 11h 24m
5d2h5m