【问题标题】:Java conditional regex to check 24 hour time?‽Java 条件正则表达式检查 24 小时时间?‽
【发布时间】: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;
  }
}

我也看过:

最后的问题是,为什么在第一个代码中,正则表达式匹配 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:5999:50,但不匹配24:60
  • 请参阅stackoverflow.com/questions/1494671/… 了解可能的解决方案。

标签: java regex string testing time


【解决方案1】:

这是因为| 存在。在此之后的替代方案,[0-9]+ 匹配从 1 到 9 的任何数字,并中断所需的输出。

following regex 应该可以工作,

^([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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多