为什么这些数据YYYY-MM-DD正则表达式在Java中失败?

时间:2010-03-24 15:25:00

标签: java regex

我的第一个问题,我很兴奋......自从上线以来我一直潜伏着并热爱这个网站,不过我为任何新手错误,格式化等道歉......

我正在尝试验证包含Java日期的字符串字段的格式。我们将以字符串形式接收日期,在将其解析为实际Date对象之前,我将验证其格式。传入的格式为YYYY-MM-DD格式。然而,我坚持我的一个测试,如果我通过“1999-12-33”测试将失败(因为它应该是第33天)这个不完整的模式:

((19|20)\\d{2})-([1-9]|0[1-9]|1[0-2])-([12][0-9]|3[01])

但是,只要我在下面添加粗体字符,它就会通过测试(但不应该)

((19|20)\\d{2})-([1-9]|0[1-9]|1[0-2])-(0[1-9]|[1-9]|[12][0-9]|3[01])

*附加说明,我知道我可以将0[1-9]|[1-9]更改为0?[1-9],但我想将所有内容分解为最简单的格式,以尝试查找无效的原因。

以下是我为完成所有不同日期场景而进行的废料测试:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class scrapTest {
    public scrapTest() {
    }

    public static void main(String[] args) {

        scrapTest a = new scrapTest();
        boolean flag = a.verfiyDateFormat("1999-12-33");
    }   

    private boolean verfiyDateFormat(String dateStr){
        Pattern datePattern = Pattern.compile("((19|20)\\d{2})-([1-9]|0[1-9]|1[0-2])-(0[1-9]|[1-9]|[12][0-9]|3[01])");
        Matcher dateMatcher = datePattern.matcher(dateStr);
        if(!dateMatcher.find()){
            System.out.println("Invalid date format!!! -> " + dateStr);
            return false;
        }
        System.out.println("Valid date format.");
        return true;
    } 
}

我已经编程了大约10年但是对Java非常新,所以请随意解释任何你认为合适的基本内容。

5 个答案:

答案 0 :(得分:8)

我认为这是因为您使用的是dateMatcher.find()而不是dateMatcher.matches()。前者寻找匹配,后者尝试匹配整个字符串。请参阅API page。所以基本上33中的前3个将匹配你刚添加的[1-9],而第3个将不会被任何东西匹配,但该方法仍然返回true。

答案 1 :(得分:5)

(0 [1-9] | [1-9] | [12] [0-9] | 3 [01])

第二种情况,[1-9],看起来是成功的部分,因为你没有对字符串结尾进行测试。

匹配1999-12-3,而不是1999-12-33

答案 2 :(得分:3)

如何使用SimpleDateFormat专门为此而设计?

Date d = new SimpleDateFormat("yyyy-MM-dd").parse(somestring);
if (d == null) {
    // somestring is not a Date
} else {
    // d is the Date
}

SimpleDateFormat的文档

答案 3 :(得分:2)

不是问题的答案,而是一个建议:编写一个更简单的正则表达式,然后在Java中进行数字验证,而不是在你的正则表达式中进行数字验证:

(\\d{4})-(\\d{2})-(\\d{2})

将此与您的输入相匹配,提取相关组并转换为整数,然后检查年,月和日部分,以确保它们在可接受的范围内。

答案 4 :(得分:1)

就像Broam所说的那样,你的模式会找到匹配日期的一部分,以匹配整个输入字符串,使用:

if (!dateMatcher.matches()) {

而不是find()