如何创建匹配正则表达式模式的时间

时间:2016-09-26 06:36:13

标签: java regex time

我一直在写一个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;
   }
}

谢谢。

5 个答案:

答案 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]匹配012小时,[0-5][0-9]匹配059分钟,\\s*匹配为零或更多空格,[Aa][Mm]匹配AmAMaMam。如果需要前导0,请删除{{1来自?之后。)

请参阅Java demo

答案 2 :(得分:1)

  1. 您为什么使用^?没有用。一个Exponent用于在字符串开头处断言位置,但我没有看到任何使用它来匹配时间。

  2. 数字为12位数。 \d{1}表示只有一位数字。您应该使用\d{1,2}来表示一位或两位数。

  3. [A]无需关注{1}。它本身意味着只有一个角色,而A。如果您还要添加对PM的支持,那么您可以使用[AP],然后只使用[M]M

  4. 您可以使用此RegEx

    \d{1,2}:\d{1,2}\s[AP][M]
    

    转义格式为:

    \\d{1,2}:\\d{1,2}\\s[AP][M]
    

    DEMO

答案 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上查看屏幕底部的指南