我应该检查一个字符串是否匹配某个模式。模式如下
dd.mm.yyyy HH:mm;score;duration
如何构建有关上述问题的正则表达式模式?我在代码中错过了什么或做错了什么?
我对诸如分号,冒号,空格键和何时使用\
或\\
的特殊字符感到困惑
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)){
...
答案 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()
给出了一个任意多个数字的模式。
优势:
但是您的示例表明,您不仅仅需要验证模式。您想要的是语义。您要检查dd.MM.yyyy实际上是一个有效日期。这是不可能的,因为正确日期的语言(通常)是不规则的。如果仅考虑日期的有限子集(例如1990年至2400年),您可以可以执行此操作(有限的语言始终是常规语言),但这会很混乱。