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
相关产品推荐
相关产品推荐

