在Java中使用正则表达式查找字符串中的12小时格式时间

时间:2016-10-22 04:50:27

标签: java regex

我试图在Java中使用正则表达式在String中查找时间。这是正则表达式:

Game.where("Time(DATE_ADD(start_in_time, INTERVAL 8 HOUR)) between '11:00:00' and '14:00:00'")

应该寻找1位或2位数,然后是冒号,两位数,然后是#34; am"或" pm" (无论如何)。

它主要起作用,但是如果我将整个正则表达式包装在捕获组中,我只能得到hh:mm。例如," 12:34 am"只返回" 12:34"。不,#34; am"。

更新:完整代码示例

\d{1,2}?:\d\d(?)(am|pm)??

任何人都知道为什么?

4 个答案:

答案 0 :(得分:2)

您可能希望使用\b(?:[01]?\d|2[0-3]):[0-5]?\d(?:[ap]m)?\b来匹配时间,而不是使用不区分大小写的标记,或者甚至使用24h表示法和12h表示法之间的替代值来代替您当前的模式am / { {1}}

您当前的模式使用惰性可选模式来匹配pm / ampm),因为它位于模式的末尾,它永远不会匹配(除非在.matches()而不是.find()的上下文中使用,因为它强制完全匹配。)

老实说,我不确定你的模式中的(am|pm)??

答案 1 :(得分:1)

通过修改测试字符串以匹配大小写,移除无关的问号并添加周围的组,这可以正确地获得您的组。

Pattern p = Pattern.compile("(\\d{1,2}:\\d\\d(AM|PM)?)");
Matcher matcher = p.matcher("12:34AM");
Assert.assertTrue(matcher.find());
Assert.assertEquals("12:34AM", matcher.group());

答案 2 :(得分:1)

当你匹配12小时格式时,有许多必须覆盖,所以永远不要使用\d因为它将接受用户给出的任何数字编号输入,你的正则表达式将对这些无效的情况失败,如{{1 }} 13:32am或许多其他非12小时格式

所以要强行使用

\\b(1[012]|0[1-9]):([0-5][0-9])(\\s)?([Aa]|[pP])[mM]

22:23am \\b(1[012]|0?[1-9]):字边界,然后是\\b10,11,12 0

来自1-9

:([0-5][0-9]) :字符匹配数字

00-59可以有一个空格

(\\s)? am am,AM或pm,PM等

完整的代码将是

([Aa]|[pP])[mM]

使 Pattern pattern=Pattern.compile("\\b(1[012]|0[1-9]):([0-5][0-9])(\\s)?([Aa]|[pP])[mM]"); Matcher matcher=pattern.matcher("12:23am 12:6am ds 13:32am dwdw c 01:12am ded 1:21am"); while (matcher.find()) { System.out.println(matcher.group()); } 1:21am等输入更灵活。

\\b(1[012]|0?[1-9]):([0-5]?[0-9])(\\s)?([Aa]|[pP])[mM]

答案 3 :(得分:-1)

抱歉,我编辑过:\d?\d:\d?\d["a"|"p"|"A"|"P"]["m"|"M"]