如何修复日期正则?仅匹配dd/MM/yyyy并解决SimpleDateFormat兼容问题
解决dd/MM/yyyy格式的正则匹配与日期解析问题
咱们先搞定正则表达式的问题,再解决SimpleDateFormat自动兼容短年份的坑。
一、修正正则表达式,仅匹配dd/MM/yyyy格式
你当前的正则有两个关键问题导致它会接受两位年份:
- 年份部分的
([0-9][0-9])?[0-9][0-9]里的?让前两位年份变成可选,所以两位年份也能匹配成功; - 你用了双竖线
||,这在正则里是语法错误,会匹配空字符串,导致日期/月份的范围判断失效。
另外,原正则的日期和月份范围也不够严谨(比如允许00日或00月,这不是合法日期)。下面是修正后的正则:
Pattern pattern = Pattern.compile("^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/\\d{4}$");
正则各部分解释:
0[1-9]|[12][0-9]|3[01]:匹配合法日期(01-31,避免00日)0[1-9]|1[012]:匹配合法月份(01-12,避免00月)\\d{4}:严格匹配4位数字的年份,确保必须是yyyy格式
修改后的测试代码:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String validValue = "10/02/2020"; String invalidValue = "10/02/20"; Pattern pattern = Pattern.compile("^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/\\d{4}$"); Matcher matcher1 = pattern.matcher(validValue); System.out.println(matcher1.find()); // 输出true Matcher matcher2 = pattern.matcher(invalidValue); System.out.println(matcher2.find()); // 输出false } }
二、让SimpleDateFormat严格解析dd/MM/yyyy格式
SimpleDateFormat默认是宽松模式(lenient),会自动兼容短年份(比如把20转换成2020或者1920,取决于JDK默认的世纪范围)。要让它严格按照指定格式解析,需要调用setLenient(false),这样不符合格式的输入会直接抛出ParseException。
示例代码:
import java.text.ParseException; import java.text.SimpleDateFormat; public class DateParseTest { public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); sdf.setLenient(false); // 开启严格模式 try { sdf.parse("10/02/20"); // 短年份,会抛出异常 System.out.println("解析成功"); } catch (ParseException e) { System.out.println("解析失败:" + e.getMessage()); } try { sdf.parse("10/02/2020"); // 合法格式,解析成功 System.out.println("解析成功"); } catch (ParseException e) { System.out.println("解析失败:" + e.getMessage()); } } }
运行这段代码,10/02/20会触发解析失败,而10/02/2020会正常解析。
内容的提问来源于stack exchange,提问作者Gustavo
相关产品推荐
相关产品推荐

