为日期格式找到最佳的正则表达式模式

时间:2019-06-26 13:30:42

标签: 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 个答案:

答案 0 :(得分:0)

更轻松的表情

^\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字符串中使用它们,每个\必须用\进行转义,因此\-> \\

我没有测试过模式,所以可能存在一些错字

答案 1 :(得分:0)

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

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

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年),您可以可以执行此操作(有限的语言始终是常规语言),但这会很混乱。