首页 > 解决方案 > 支持字母表的 24 小时制时钟的正确正则表达式是什么(java)

问题描述

这是程序:

public static boolean hasValidLengthAndSeparator(String s) {
  boolean answer = false;
  String text = s;
  String pattern = "([01a]?[0-9]+[b]?|2[0-3]+?):[c]?[d]?[0-5]?[0-9]?";

  Pattern r = Pattern.compile(pattern);
  Matcher m = r.matcher(text);


  if (m.find()) {
      answer = true;
  }
  else {
      answer = false;
  }
  return answer;
}

当我进行测试时,“1:30”失败(它返回真,但它不应该)我该如何解决?

标签: javaregex

解决方案


回答:(?:[01a][\\db]|2[0-9b]):[0-9c][\\dd]

如果长度为 5 且第三个字符是冒号,则正则表达式允许字符串验证为真,否则为假。

通过使用此测试仪:

@Test
  public void test09_hasValidLengthAndSeparator() {
    final String[] VALID = {"01:30", "ab:cd", "29:99"};
    for (int i = 0; i < VALID.length; i++) {
      String s = VALID[i];
      String error = 
          String.format("regextest.hasValidLengthAndSeparator(s) returned false for s = %s", s);
      assertTrue(error, lab0.hasValidLengthAndSeparator(s));
    }
    final String[] NOT_VALID = {"", "1:30", "01,23", "29:9"};
    for (int i = 0; i < NOT_VALID.length; i++) {
      String s = NOT_VALID[i];
      String error = 
          String.format("regextest.hasValidLengthAndSeparator(s) returned true for s = %s", s);
      assertFalse(error, regextest.hasValidLengthAndSeparator(s));
    }
  }

推荐阅读