我试图在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)??
任何人都知道为什么?
答案 0 :(得分:2)
您可能希望使用\b(?:[01]?\d|2[0-3]):[0-5]?\d(?:[ap]m)?\b
来匹配时间,而不是使用不区分大小写的标记,或者甚至使用24h表示法和12h表示法之间的替代值来代替您当前的模式am
/ { {1}}
您当前的模式使用惰性可选模式来匹配pm
/ am
(pm
),因为它位于模式的末尾,它永远不会匹配(除非在.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]):
字边界,然后是\\b
或10,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
等输入更灵活。
答案 3 :(得分:-1)
抱歉,我编辑过:\d?\d:\d?\d["a"|"p"|"A"|"P"]["m"|"M"]