String.matches返回false:如何匹配结尾带点加2-3字符的字符串
问题原因与解决方案
我来帮你排查一下问题,其实这里有两个关键的点导致String.matches()返回false:
1. String.matches()的特性
Java的String.matches()方法要求正则表达式完全匹配整个字符串,而不是只匹配字符串的某一部分。你的正则[.][a-z0-9A-Z][a-z0-9A-Z][a-z0-9A-Z]$只描述了字符串结尾的部分,前面的qsdgfdssdh没有被正则覆盖,所以整个字符串无法匹配,自然返回false。
2. 正则表达式本身不符合需求
你想要匹配的是“点加2个或3个字符结尾”,但你的正则只能匹配点后恰好3个字符的情况,没有覆盖2个字符的场景。
修正后的解决方案
调整正则表达式,让它能匹配整个字符串,同时支持点后2或3个字符的情况:
方案一:使用matches()方法(匹配整个字符串)
String testStr = "qsdgfdssdh.nfo"; // 修正后的正则:.* 匹配任意前置字符,\\. 匹配点,{2,3} 匹配2-3个字母/数字,$ 锁定结尾 boolean result = testStr.matches(".*\\.[a-zA-Z0-9]{2,3}$"); System.out.println(result); // 输出true
解释一下各部分:
.*:匹配任意数量(包括0个)的任意字符,覆盖字符串开头到点之前的所有内容\\.:转义后的点字符(正则里.是通配符,必须转义才能匹配实际的点),你之前用[.]也可以,效果一样[a-zA-Z0-9]{2,3}:匹配2到3个大小写字母或数字,满足你的需求$:确保匹配的是字符串的结尾,避免中间出现点加2-3字符的情况被误判
方案二:使用Pattern+Matcher做部分匹配
如果你不想匹配整个字符串,只是检查结尾是否符合规则,可以用find()方法:
String testStr = "qsdgfdssdh.nfo"; Pattern pattern = Pattern.compile("\\.[a-zA-Z0-9]{2,3}$"); Matcher matcher = pattern.matcher(testStr); boolean result = matcher.find(); // 查找字符串中是否存在符合规则的结尾 System.out.println(result); // 输出true
这样就能正确匹配你示例中的字符串啦。
内容的提问来源于stack exchange,提问作者user3021955
相关产品推荐
相关产品推荐

