用点分隔的Java正则表达式匹配日期

用点分隔的Java正则表达式匹配日期,java,regex,date,Java,Regex,Date,我有下面的正则表达式 [\d\\d[.]\d\d[.]\d\d] 和[\\d\\d\.\\d\\d\.\\d\\d].* 谁既能正确地匹配带有日期的行,又能匹配没有日期但只有数字(和文本)的行 我的文本格式如下: 12.04.18, 15:59 - A: xyz 12345 abc 12.04.18, 16:00 - B: cde abc 12345 我希望正则表达式与第1行和第3行匹配,您需要转义句点字符,因为它在正则表达式中被视为通配符。此外,您在不需要的地方使用了。字符类用方括号表示,用

我有下面的正则表达式
[\d\\d[.]\d\d[.]\d\d]
[\\d\\d\.\\d\\d\.\\d\\d].*
谁既能正确地匹配带有日期的行,又能匹配没有日期但只有数字(和文本)的行

我的文本格式如下:

12.04.18, 15:59 - A: xyz
12345 abc
12.04.18, 16:00 - B: cde
abc 12345

我希望正则表达式与第1行和第3行匹配,您需要转义句点字符,因为它在正则表达式中被视为通配符。此外,您在不需要的地方使用了。字符类用方括号表示,用于列出该位置的可接受字符。使用此正则表达式签出:

\d\d\.\d\d\.\d\d.*$

解释
  • \d
    搜索您知道的数字
  • \。
    查找literal
    字符,而不是将句点的正则表达式解释为通配符
  • *
    用于匹配日期匹配后的行剩余部分
  • $
    表示行的结尾,确保我们已匹配整行

    • 通常建议不要使用正则表达式验证日期时间字符串,而是使用标准库中的日期时间格式化程序。在你的情况下,这可能不是绝对必要的,但我想把它作为一个选项,既给你,也给任何阅读的人

          DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.uu, H:mm");
          String[] lines = {
                  "12.04.18, 15:59 - A: xyz",
                  "12345 abc",
                  "12.04.18, 16:00 - B: cde",
                  "abc 12345"
          };
          for (String line : lines) {
              ParsePosition pos = new ParsePosition(0);
              try {
                  LocalDateTime dateTime = LocalDateTime.from(formatter.parse(line, pos));
                  System.out.println("Match. Date-time is " + dateTime 
                          + ". Remainder of line is: " + line.substring(pos.getIndex()));
              } catch (DateTimeParseException dtpe) {
                  System.out.println("No match. Line was: " + line);
              }
          }
      
      上面的代码片段打印:

      匹配。日期时间为2018-04-12T15:59。行的其余部分是:-A:xyz
      没有对手。电话号码是:12345 abc
      匹配。日期时间为2018-04-12T16:00。行的剩余部分是:-B:cde
      没有对手。电话号码是:abc 12345
      
      潜在优势包括:

      • 它更严格地验证了数字是否构成了有效的日期和时间
      • 从代码中可以清楚地看出,日期时间正在被检查。正则表达式的正确读写有点棘手
      • 您可以将日期和超时作为日期时间对象,以便在需要时进行进一步处理

      [\d\\d[.]\d\d[.]\d\d]
      在实际的正则表达式中,它周围的方括号都是吗?您将它们都放在一个字符类中。拆下外支架<代码>“\\d\\d[.]\\d\\d[.]\\d\\d”不匹配。@karottenbunker这是对我的
      “\\d\\d[.]\\d\\d[.]\\d\\d”
      建议的反馈吗?是的。您的代码可能只是使用了
      .matches()
      ,而您应该使用
      .find()
      。如果有日期,您希望匹配整行还是仅匹配日期部分?我不确定您是否需要使用双斜杠作为数字字符(
      \\d
      )。我不太熟悉Java中的正则表达式,但如果这不起作用,应该使用双斜杠。