我使用以下正则表达式验证java中的日期:
"^(0?[1-9]|[12][0-9]|3[01])[-./](0?[1-9]|1[012])[-./]((19|20)\\d\\d)$"
但它也采用21-12.2014或2014年12月21日等格式作为有效日期。我知道这是因为我在我的正则表达式中使用了[-./]
。我该如何避免这个问题?
答案 0 :(得分:2)
在这里你需要使用反向引用。
"^(0?[1-9]|[12][0-9]|3[01])([-./])(0?[1-9]|1[012])\\2((19|20)\\d\\d)$"
上述正则表达式中的 \\2
指的是组索引2中存在的字符。
注意:请勿使用正则表达式解析日期。
示例:强>
String s1 = "21-12-2014";
String s2 = "21-12/2014";
System.out.println(s1.matches("^(0?[1-9]|[12][0-9]|3[01])([-./])(0?[1-9]|1[012])\\2((19|20)\\d\\d)$"));
System.out.println(s2.matches("^(0?[1-9]|[12][0-9]|3[01])([-./])(0?[1-9]|1[012])\\2((19|20)\\d\\d)$"));
<强>输出:强>
true
false
答案 1 :(得分:0)
根本不使用正则表达式。只需解析日期,因为无论如何你显然都要这样做。
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
Date d = sdf.parse(dateStr.replaceAll("[./]", "-"));
捕获无效日期的例外。