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

Java中Pattern.matches()检测日期正则返回false的问题

问题原因与解决方案

核心问题

Java的Pattern.matches()方法要求整个输入字符串必须完全匹配正则表达式,而你的测试字符串"31/07/12;401000;02/04/2013;400;"里除了日期格式的子串,还有分号、其他数字等内容,所以整个字符串无法和你的正则\d{2,4}/\d{2}/\d{2,4}完全匹配,因此返回false。而regex101默认是查找字符串中是否存在匹配的子串,这和matches()的行为不一样,所以你在regex101上验证时会显示匹配成功。

两种解决办法

方法1:使用find()方法(推荐)

Matcher.find()方法会在字符串中查找是否存在任意一个匹配的子串,不需要整个字符串完全匹配,更符合你“检测字符串中是否包含日期”的需求:

import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) {
        String line = "31/07/12;401000;02/04/2013;400;";
        System.out.println(Pattern.compile("\\d{2,4}/\\d{2}/\\d{2,4}").matcher(line).find());
    }
}

方法2:修改正则表达式适配matches()

如果你一定要使用matches(),可以在正则表达式的前后添加.*,表示匹配任意数量的任意字符(包括0个),这样整个字符串只要包含目标日期子串就能匹配:

import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) {
        String line = "31/07/12;401000;02/04/2013;400;";
        System.out.println(Pattern.compile(".*\\d{2,4}/\\d{2}/\\d{2,4}.*").matcher(line).matches());
    }
}

补充说明

另外,你的当前正则只是匹配了数字/数字/数字的格式,没有验证日期的合法性(比如月份不能超过12、日期不能超过对应月份的天数等),如果需要严格验证日期有效性,还需要进一步优化正则表达式,但这不是当前问题的核心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:30:21