You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复日期正则?仅匹配dd/MM/yyyy并解决SimpleDateFormat兼容问题

解决dd/MM/yyyy格式的正则匹配与日期解析问题

咱们先搞定正则表达式的问题,再解决SimpleDateFormat自动兼容短年份的坑。

一、修正正则表达式,仅匹配dd/MM/yyyy格式

你当前的正则有两个关键问题导致它会接受两位年份:

  1. 年份部分的([0-9][0-9])?[0-9][0-9]里的?让前两位年份变成可选,所以两位年份也能匹配成功;
  2. 你用了双竖线||,这在正则里是语法错误,会匹配空字符串,导致日期/月份的范围判断失效。

另外,原正则的日期和月份范围也不够严谨(比如允许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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 07:18:13