使用Java中的正则表达式确定输入字符串是否与时钟时间匹配

时间:2016-04-02 17:37:18

标签: java regex

我试图确定输入字符串是否处于有效的24小时日期格式(即hh:mm:ss)。我使用了一些不同的逻辑,并且我的测试用例大部分都成功了。我的代码目前无法完成我尝试过的所有输入(包括下面的输入)。

该表达式应该以下列方式工作:

  • 输入11:24:10应输出Valid form
  • 输入00:13:42应输出Valid form
  • 输入24:52:25应输出Invalid form
  • 输入05:62:55应输出Invalid form

这是我的代码:

import java.util.Scanner;

public class Main {

   public static void main(String[] args) {
      System.out.print("String to check: ");
      String input = new Scanner(System.in).nextLine();

      if (input.matches("((0|1)[0-9])|(2[0-3]):[0-5][0-9]:[0-5][0-9]")) {
         System.out.println("Valid form");
      } else {
         System.out.println("Invalid form");
      }
   }
}

我最近才开始学习Java,如果之前已经问过这个问题,我道歉(我用Google搜索了!)。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

应该是

(((0|1)[0-9])|(2[0-3])):[0-5][0-9]:[0-5][0-9]

根据你的正则表达式

((0|1)[0-9])|(2[0-3]):[0-5][0-9]:[0-5][0-9]

它将匹配((0|1)[0-9])(2[0-3]):[0-5][0-9]:[0-5][0-9]

如果您只想将其匹配为

,也可以使用non capturing
(?:(?:(?:0|1)[0-9])|(?:2[0-3])):[0-5][0-9]:[0-5][0-9]

通过修改小时部分

可以进一步简化您的正则表达式
[01][0-9]

<强> IDEONE DEMO

修改

稍加修改

(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]

<强> REGEX DEMO

答案 1 :(得分:1)

问题是您当前的正则表达式将匹配(0|1)[0-9])(2[0-3]):[0-5][0-9]:[0-5][0-9]。您希望||运营商使用(0|1)[0-9])(2[0-3])。所以你想要的是:

((0|1)[0-9])|(2[0-3]):[0-5][0-9]:[0-5][0-9]

您还有资源泄漏,因为您没有关闭Scanner。最好将新Scanner存储在变量中,以便以后关闭它。这是完整的代码:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        System.out.print("String to check: ");
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();

        if (input.matches("(((0|1)[0-9])|(2[0-3])):[0-5][0-9]:[0-5][0-9]")) {
            System.out.println("Valid form");
        } else {
            System.out.println("Invalid form");
        }

        sc.close();
    }
}