2012-11-20 91 views
4

我对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),应该理解为天强制要求或小时强制要求或分钟强制要求)。

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

回答

4

您可以使用前瞻断言来确保至少出现dhm之一。

(?=.*[mhd])(?:(\d+)d)?\s*(?:(\d+)h)?\s*(?:(\d+)m)? 
+1

'[]'没用here..except'[MHD]' – Anirudha

+0

的look-前进的作品很棒!和@ Fake.It.Til.U.Make.It,谢谢你的清洁提示。然后我的新正则表达式是:(?=。* [mhd])(?:(\ d +)d)?\ s *(?:(\ d +)h)?\ s *(? “(呃,不是我的,实际上我多说一点,以允许空间或大小写错误......) – Chop

2

由于OmnipotentEntity建议,你可以用一个积极的前瞻,以确定该号码后跟一个dmh

写作的另一种方式则可能是:

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

这将匹配下面:

4d 8h 42m 
3d 
15h 
28m 
12d 24m 
2h 55m 
7d 11h 24m 
5d2h5m 
+0

这个想法很好,但访问会更困难。使用OmnipotentEntity的想法,我知道days = group(1),hours = group(2),...在这里,我必须测试每个。另外,没有办法确保每个单位只通过一次。谢谢,不过。 – Chop

相关问题