2016-09-26 37 views
2

我一直在编写一个java程序。在程序中,我正在从用户那里接受一个输入。我把输入作为一个字符串,并检查它是否匹配模式。我想要的格局是格式:10:15 AM如何创建时间匹配正则表达式

这是我试过的,但它似乎没有工作。

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; 
    } 
} 

谢谢。

+3

你应该使用SimpleDateFormat,而不是正则表达式 – Jens

+0

你想用你的正则表达式来检查什么? '\ d {1}'表示只有1个数字,'^ [A] {1}'表示一个'''然后一个'A'。所有这些都没有意义,并且与您的首选格式不匹配 –

回答

5

简单地停在那儿。 Java已经有一种机制来解析包含日期/时间值的字符串。

研究正则表达式很好,但是不是将它们用于框架中已经存在的东西。您的解决方案总是相比SimpleDateFormat已经为您做的不足!

1
  1. 为什么使用^?没有用处。指数用于断言字符串的开始位置,但我没有看到用这个来匹配时间。

  2. 这些数字是12数字。 \d{1}表示只有一个数字在那里。您应该改用\d{1,2}表示一个或最多两位数字。

  3. {1}没有必要遵循[A]。它本身意味着只有一个字符,那就是A。如果你想添加对PM的支持,那么你可以使用[AP],然后简单地[M]或简单地M

你可以使用这个表达式

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

转义格式是:

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

DEMO

+0

1.要字面匹配'^',如果它位于字符串的中间,则可以简单地使用'^'而无需转义。 2.在“正则表达式”的情况下,数字应该是'\ d'而不是'\\ d'(这是由Java字符串文字引起的转义。你不需要'[''''最后一个'M' –

+0

@AdrianShum感谢您的通知,我已经相应地更新了我的答案。 –

-1

你应该首先测试你的正则表达式,尝试http://rubular.com/

\d{2}[:]\d{2}\s*[A][M] //should work, this is the general regex 

不要把^,在表示字符串的开头,中间,($意味着结束检查在屏幕底部的指导方针,在rubular.com

+0

错误。中间的'^'的意思是'^'字面意思是 –

+0

opps我并不是指字面上的@adrian shum –

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,从[0-1]后删除?。)

Java demo

+0

如果在时间和AM之间必须有*一个空白*,请从'\'后面删除'*' \ s'。 –

1

有几个是不是由你,而你正在使用正则表达式

1理解正确的事情。 )^是正则表达式的保留字符,因此在使用它时必须将其转义。虽然它在这里使用不正确,但如果你想工作,使用反斜杠()将其转义。

所以表达式(虽然还是不正确但应该是这样的)

  \\d{1}:\\d{1}\^[A]{1}[M]{1}      <- Watch carefully \^ 

2)@GhostCat advice是正确的,使用的SimpleDateFormat这里。

3.)如果你还想继续使用正则表达式,它应该看起来这符合模式。

 \\d{2}:\\d{2}\\s+(AM|PM) 

了解由部分正则表达式的一部分现在

\\ d {2} - >这表示两个数字恰好

- >这表示一个两位数后的冒号

\\ d {2} - >这说明冒号后的两个数字完全相同

\\ s + - >这说的匹配任何没有。 XX:XX之后的空格字符,您可以跳过它,因为它只是为了让您的正则表达式更加健壮。

(上午|下午) - >这是一个捕获组,并表示匹配AM或(|)PM而不是别的。