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

Pro*_*eur 10 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;
    } 
}
Run Code Online (Sandbox Code Playgroud)

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

mio*_*rel 8

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


Bro*_*oam 5

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

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

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