我一直在写一个java程序。在程序中,我正在接受用户的输入,这是一个时间。我将输入作为字符串并检查它是否与模式匹配。我想要的格式是格式:上午10:15
这是我尝试的但它似乎无法发挥作用。
public static boolean checkTimePattern(String time) {
Pattern pattern = Pattern.compile("\\d{1}:\\d{1}^[A]{1}[M]{1}");
if(pattern.matcher(time).matches()){
return true;
}else{
return false;
}
}
谢谢。
答案 0 :(得分:5)
只需停在那里。 Java已经有一种机制来解析包含日期/时间值的字符串。
研究正则表达式很好,但不将它们用于框架中已存在的东西。与SimpleDateFormat已为您做的事情相比,您的解决方案总是不足!
答案 1 :(得分:2)
您的正则表达式只允许1小时数字和1分钟数字,并且需要在A
之前显示字符串的开头。这没什么意义。
验证时间(或日期)的最佳方法,请使用SimpleDateFormat
:
String s = "10:15 AM";
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a");
sdf.setLenient(false);
try {
Date dt2 = sdf.parse(s);
System.out.println(dt2);
}
catch (Exception exc) {
System.out.println(s + " IS NOT VALID TIME");
}
如果您一定要使用正则表达式,请使用
//Regex
String pat = "[0-1]?[0-2]:[0-5][0-9]\\s*[Aa][Mm]";
if (s.matches(pat)){
System.out.println("Regex matches the string!");
}
([0-1]?[0-2]
匹配0
到12
小时,[0-5][0-9]
匹配0
到59
分钟,\\s*
匹配为零或更多空格,[Aa][Mm]
匹配Am
,AM
,aM
或am
。如果需要前导0
,请删除{{1来自?
之后。)
请参阅Java demo
答案 2 :(得分:1)
您为什么使用^
?没有用。一个Exponent用于在字符串开头处断言位置,但我没有看到任何使用它来匹配时间。
数字为1
或2
位数。 \d{1}
表示只有一位数字。您应该使用\d{1,2}
来表示一位或两位数。
[A]
无需关注{1}
。它本身意味着只有一个角色,而A
。如果您还要添加对PM
的支持,那么您可以使用[AP]
,然后只使用[M]
或M
。
您可以使用此RegEx
\d{1,2}:\d{1,2}\s[AP][M]
转义格式为:
\\d{1,2}:\\d{1,2}\\s[AP][M]
答案 3 :(得分:1)
当您使用正则表达式
时,有些事情未被您正确理解1。)^是正则表达式的保留字符,因此在使用时必须将其转义。虽然它在这里使用不正确,但仍然如果你想工作,使用反斜杠()来逃避它。
所以表达式(虽然仍然 INCORRECT 但应该是这样的)
\\d{1}:\\d{1}\^[A]{1}[M]{1} <- Watch carefully \^
2。)@GhostCat advice是正确的,在这里使用SimpleDateFormat。
3。)如果您仍想继续使用正则表达式,它应该看起来与模式匹配。
\\d{2}:\\d{2}\\s+(AM|PM)
现在逐一了解正则表达式
\\ d {2} - &gt;这说两位数正好
: - &gt;这表示两位数之后的冒号
\\ d {2} - &gt;这说明冒号后的两位数
\\ s + - &gt;这说不匹配。在XX:XX之后的空格字符,你可以跳过它,因为它只是为了让你的正则表达式更强大。
(AM | PM) - &gt;这是一个捕获组,并表示匹配AM OR(|)PM和其他任何内容。
答案 4 :(得分:-1)
您应首先测试正则表达式,然后尝试http://rubular.com/
\d{2}[:]\d{2}\s*[A][M] //should work, this is the general regex
不要把^放在中间,这意味着字符串的开头,($表示在rubular.com上查看屏幕底部的指南