Java条件正则表达式检查24小时时间?‽;
我正在进行以下编程练习:语句是: 编写正则表达式以验证24小时时间字符串。参见示例 找出您应该检查的内容: 接受时间:01:00-1:00 不接受: 24:00 您应该检查长度是否正确,并且没有空格 我想问一下,为什么下面的正则表达式与24:00匹配Java条件正则表达式检查24小时时间?‽;,java,regex,string,testing,time,Java,Regex,String,Testing,Time,我正在进行以下编程练习:语句是: 编写正则表达式以验证24小时时间字符串。参见示例 找出您应该检查的内容: 接受时间:01:00-1:00 不接受: 24:00 您应该检查长度是否正确,并且没有空格 我想问一下,为什么下面的正则表达式与24:00匹配 public class RegexValidation { public static boolean validateTime(String time) { System.out.println("time: "+time);
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;
}
}
公共类RegexValidation{
公共静态布尔验证时间/*⌚*/(字符串时间){
if(time.matches(“[\\d]+:[\\d]{2}”)){
String[]times=time.split(“:”);
整小时=整数.parseInt(乘以[0]);
int minutes=Integer.parseInt(乘以[1]);
返程时间<24小时,返程时间<60分钟;
}
返回false;
}
}
我也读过:
最后一个问题是,为什么在第一个代码中regex与24:00匹配?——这是因为存在
。在此之后的另一个选项,[0-9]+
匹配1到9之间的任何数字,并中断所需的输出
这应该是有效的
^([01]\d|[0-9]|2[0-3]):?([0-5]\d)$
如果:
不是可选的,请删除?
^([01]\d|[0-9]|2[0-3]):([0-5]\d)$
也在jshell
jshell> var pattern = Pattern.compile("^([01]\\d|[0-9]|2[0-3]):?([0-5]\\d)$");
pattern ==> ^([01]\d|[0-9]|2[0-3]):?([0-5]\d)$
jshell> pattern.matcher("23:01").matches();
$2 ==> true
jshell> pattern.matcher("24:01").matches();
$3 ==> false
jshell> pattern.matcher("00:01").matches();
$4 ==> true
jshell> pattern.matcher("09:01").matches();
$5 ==> true
jshell> pattern.matcher("9:01").matches();
$6 ==> true
jshell> pattern.matcher("12:00").matches();
$7 ==> true
由于交替
|
,模式匹配24:00
。如果第一部分不匹配,则[0-9]+:[0-5]+[0-9]
将匹配24:00
模式可以写为^2[0123]+:[0-5]+[0-9]+:[0-5]+[0-9]
,也将匹配,例如24:59
或99:50
,但不24:60
,请参阅以获取可能的解决方案。