我的第一个问题,我很兴奋......自从上线以来我一直潜伏着并热爱这个网站,不过我为任何新手错误,格式化等道歉......
我正在尝试验证包含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非常新,所以请随意解释任何你认为合适的基本内容。
答案 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 }
答案 3 :(得分:2)
不是问题的答案,而是一个建议:编写一个更简单的正则表达式,然后在Java中进行数字验证,而不是在你的正则表达式中进行数字验证:
(\\d{4})-(\\d{2})-(\\d{2})
将此与您的输入相匹配,提取相关组并转换为整数,然后检查年,月和日部分,以确保它们在可接受的范围内。
答案 4 :(得分:1)
就像Broam所说的那样,你的模式会找到匹配日期的一部分,以匹配整个输入字符串,使用:
if (!dateMatcher.matches()) {
而不是find()
。