Java条件正则表达式检查24小时时间?‽;

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

我正在进行以下编程练习:语句是:

编写正则表达式以验证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;
  }
}
公共类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
,请参阅以获取可能的解决方案。