有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java寻找日期格式的最佳正则表达式模式

我应该检查一个字符串是否符合某种模式。模式如下

dd.mm.yyyy HH:mm;score;duration
  • 注意yyy和HH之间的空格
  • 分数是一个整数
  • 持续时间是一个双倍值

关于上述问题,如何构造正则表达式模式?我在代码中遗漏了什么或做错了什么

我主要对分号、冒号、空格键等特殊字符感到困惑,以及何时使用\\\

public HighscoreEntry(String data) {

    String pattern= "^(3[01]|[12][0-9]|0?[1-9])\\.\\(1[0-2]|0?[1-9])\\.\\(20[0-9]{2})\\s\\(2[0-4]|[01][0-9])\\:\\(5[0-9]|[0-4][0-9]\\;\\d+\\;\\d*\\.\\d+$"; 

    if(data.matches(pattern)){
...

共 (2) 个答案

  1. # 1 楼答案

    更放松的表情

    ^\d{2}\.\d{2}\.\d{4} \d{2}:\d{2};\d+;\d.\d*$
    

    一个考虑了可能的日期和时间值

    ^[0-3][0-9]\.[0-1][0-9]\.\d{4} [0-2][0-9]:[0-5][0-9];\d+;\d*.\d*$
    

    要在Java字符串中使用它们,每个\都需要由\转义,所以\->\\

    我还没有测试这些模式,所以可能存在一些拼写错误

  2. # 2 楼答案

    既然问题是:找到最佳正则表达式模式,而不是什么是最佳正则表达式模式,我将回答这个问题。我使用的技术或多或少是一种分而治之的方法

    首先,找到分隔符。然后你可以这样构建你的模式:

    String pattern = field1() + ";" + field2() + "|" + field3(); 
    

    然后,字段可能有数据类型。请注意,并不是每个域(字符串表示)都是正则的!所以先检查一下。在你的例子中,你想要这样的东西:

    String pattern = intPattern(2) + "\\." + intPattern(2) + "\\." + intPattern(4)
                   + " " + intPattern(2) + ":" + intPattern(2)
                   + ";" + intPattern() + ";" + doublePattern();
    

    其中intPattern(n)给出了一个正好有n个数字的无符号整数的模式,intPattern()给出了任意多个数字的模式

    优点:

    1. 您可以单独测试这些模式
    2. 你不会得到一个看起来一团糟的超长正则表达式

    但你的例子表明,你想要的不仅仅是验证模式。你想要的是语义学。你想检查一下,那个dd.MM。yyyy实际上是一个有效日期。这是不可能的,因为正确日期的语言(通常)是不规则的。如果只考虑一个有限子集的日期(例如从1990到2400),则<可以EEE>做到这一点(有限的语言总是规则的),但它将是一个混乱。p>