【发布时间】:2020-04-18 10:42:24
【问题描述】:
我正在做以下编程练习:regex validation of 24 hours time. 语句是:
编写一个正则表达式来验证 24 小时时间字符串。参见示例 弄清楚你应该检查什么:
接受:01:00 - 1:00
不接受:
24:00
你应该检查正确的长度并且没有空格。
我想问一下,为什么下面这个正则表达式,匹配到24:00
public class RegexValidation {
public static boolean validateTime(String time) {
System.out.println("time: "+time);
return time.matches("(?:^[2])[0123]+:[0-5]+[0-9]|[0-9]+:[0-5]+[0-9]");
}
}
因为我认为它在表达: “如果字符串以 2 开头,那么它应该以 [0-3](一个或多个)继续:[0-5] 一个或多个和 [0-9]。否则它以 [0-9] 一个或多个继续: [0-5] 一个或多个和 [0-9]。”
测试是:
import org.junit.Test;
import static org.junit.Assert.*;
public class RegexValidationTest {
@Test
public void test1() {
assertTrue(RegexValidation.validateTime("01:00"));
}
@Test
public void test2() {
assertTrue(RegexValidation.validateTime("1:00"));
}
@Test
public void test3() {
assertTrue(RegexValidation.validateTime("00:00"));
}
@Test
public void test4() {
assertFalse(RegexValidation.validateTime("13:1"));
}
@Test
public void test5() {
assertFalse(RegexValidation.validateTime("12:60"));
}
@Test
public void test6() {
assertFalse(RegexValidation.validateTime("24:00"));
}
}
另外我写了以下解决方案,它通过了测试:
public class RegexValidation {
public static boolean validateTime/*⌚*/(String time) {
if(time.matches("[\\d]+:[\\d]{2}")){
String[] times = time.split(":");
int hours = Integer.parseInt(times[0]);
int minutes = Integer.parseInt(times[1]);
return hours < 24 && minutes < 60;
}
return false;
}
}
我也看过:
- Conditional Regular Expression in Java?
- https://www.regular-expressions.info/conditional.html
- understanding regex if then statements
最后的问题是,为什么在第一个代码中,正则表达式匹配 24:00?‽
【问题讨论】:
-
由于
|的交替,模式匹配24:00。如果第一部分不匹配,则[0-9]+:[0-5]+[0-9]将匹配24:00该模式可以写为^2[0123]+:[0-5]+[0-9]|[0-9]+:[0-5]+[0-9],也将匹配例如24:59或99:50,但不匹配24:60 -
请参阅stackoverflow.com/questions/1494671/… 了解可能的解决方案。
标签: java regex string testing time