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

Java 7环境下匹配MM/dd/yyyy和M/d/yyyy格式的正则表达式求助

解决Java 7下的日期格式验证问题

第一步:修正正则表达式匹配格式

你之前的正则存在语法错误(多余的$),且未支持单数字的月/日格式。以下正则可以同时匹配MM/dd/yyyy和M/d/yyyy:

^(1[0-2]|0?[1-9])/(3[01]|[12][0-9]|0?[1-9])/[0-9]{4}$
  • 月部分:(1[0-2]|0?[1-9]) 匹配1-12,支持带前导0(如01)或不带(如1)
  • 日部分:(3[01]|[12][0-9]|0?[1-9]) 匹配1-31,同样支持带/不带前导0
  • 年部分:[0-9]{4} 匹配4位数字年份

第二步:结合SimpleDateFormat严格模式验证日期合法性

正则只能验证格式,无法识别逻辑上非法的日期(如2/30/2022)。Java 7中可以通过设置SimpleDateFormat的严格模式来避免自动转换非法日期:

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class DateValidator {
    public static boolean isValidDate(String input) {
        // 先通过正则过滤格式
        String regex = "^(1[0-2]|0?[1-9])/(3[01]|[12][0-9]|0?[1-9])/[0-9]{4}$";
        if (!input.matches(regex)) {
            return false;
        }
        
        // 用严格模式验证日期有效性
        SimpleDateFormat sdf = new SimpleDateFormat("M/d/yyyy");
        sdf.setLenient(false); // 关闭宽松模式,非法日期直接抛异常
        try {
            sdf.parse(input);
            // 可选:限制年份范围,比如1900-2100
            int year = Integer.parseInt(input.substring(input.lastIndexOf('/') + 1));
            return year >= 1900 && year <= 2100;
        } catch (ParseException e) {
            return false;
        }
    }
}
  • setLenient(false):关闭宽松解析,输入13/1/2022这类非法月份时会直接抛出ParseException,不会自动转换日期
  • 格式字符串"M/d/yyyy":同时兼容带前导0和不带的格式(如01/31/2022和1/1/2022都能正确解析)

测试用例验证

  • 合法输入:01/31/2022、1/1/2022、12/13/2022、12/1/2022 → 返回true
  • 非法输入:13/1/2022、2/30/2022、01/32/2022 → 返回false

内容的提问来源于stack exchange,提问作者Lenny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:31:11