我对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)
,应该理解为天强制要求或小时强制要求或分钟强制要求)。
那么,如何修改我的正则表达式,以确保至少有一个我现在不捕获的组不是空的,是几天,几小时还是几分钟?
'[]'没用here..except'[MHD]' – Anirudha
的look-前进的作品很棒!和@ Fake.It.Til.U.Make.It,谢谢你的清洁提示。然后我的新正则表达式是:(?=。* [mhd])(?:(\ d +)d)?\ s *(?:(\ d +)h)?\ s *(? “(呃,不是我的,实际上我多说一点,以允许空间或大小写错误......) – Chop