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

