记一次Java使用正则解析日期分组匹配顺序问题?

先贴出正则表达式:

static String dateReg=Pattern.compile("^(\\d{4})[\\-/.年](0?[1-9]|1[012])[\\-/.月](0?[1-9]|[12]\\d|3[01])日?|([1-9]\\d{7})");

以下是解析工具方法:

static LocalDate parseDate(String date) {
    Matcher m = dateReg.matcher(date);
    if (m.find()) {
        String year = m.group(1);
        if (StringUtils.isNotEmpty(year)) {
            return LocalDate.of(Integer.parseInt(year), Integer.parseInt(m.group(2)), Integer.parseInt(m.group(3)));
        }
        return LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyyMMdd"));
    }
    throw new RuntimeException("仅支持日期格式:yyyy-MM-dd,yyyy/MM/dd,yyyyMMdd");
}

现解析日期字符串:

parseDate("2024-12-17 00:00:00")

结果:是2024-12-17 还是 2024-12-01?

结论:2024-12-01

原因分析:问题出在匹配“日”的正则表达式里顺序:

将"^(\\d{4})[\\-/.年](0?[1-9]|1[012])[\\-/.月](0?[1-9]|[12]\\d|3[01])日?|([1-9]\\d{7})" 的正则替换为"^(\\d{4})[\\-/.年](1[012]|0?[1-9])[\\-/.月]([12]\\d|3[01]|0?[1-9])日?|([1-9]\\d{7})"后,结果正确:2024-12-17。

“日” 的表达式为:0?[1-9]|[12]\\d|3[01],当匹配 17 时,表达式第一部分“0?[1-9]”有限匹配上,所以group(3)分组三返回了1,而不是17。

注意:此处是匹配并且分组提取值,所以必须优先顺序问题。若仅仅是匹配日期是否是指定的格式,那与顺序无关!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流沙QS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值