我试图确定输入字符串是否处于有效的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搜索了!)。谢谢你的帮助!
答案 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();
}
}