Matcher.matches()始终返回false,Java正则匹配Kata问题求助
正则失效原因分析与修正
1. matches()方法的问题
你写的正则^[" + c + String.valueOf(c).toUpperCase() + "]{2,}+$,其中^和$是锚定整个字符串的匹配边界——意思是只有当输入的整个字符串,完全由当前字符(大小写形式)重复至少2次组成时,matches()才会返回true。比如只有输入"EEE"或"eEe"这类纯目标字符的字符串才会匹配,但你的测试用例"recede"是多种字符组成的,所以matches()永远返回false,结果自然全是(。
2. find()方法的问题
换成[cC]{2,}这类正则后,它的作用是查找连续出现至少2次的目标字符(大小写)。但"recede"里的e是分散出现的(位置2、4、6),并非连续的,所以find()找不到任何匹配,依然全输出(。
符合需求的正则用法
你的需求是忽略大小写统计字符在整个字符串中的出现次数,不管字符是否连续。可以通过两种方式实现:
方式一:转小写后统计(更高效)
public static String encode(String word){ StringBuilder result = new StringBuilder(); String lowerWord = word.toLowerCase(); for (char c : word.toCharArray()) { long count = lowerWord.chars().filter(ch -> ch == Character.toLowerCase(c)).count(); result.append(count > 1 ? ")" : "("); } return result.toString(); }
方式二:正则统计(贴合你的思路)
用Pattern.CASE_INSENSITIVE标志忽略大小写,循环调用find()统计出现次数:
public static String encode(String word){ StringBuilder result = new StringBuilder(); for (char c : word.toCharArray()) { Pattern pattern = Pattern.compile(String.valueOf(c), Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(word); int count = 0; while (matcher.find()) { count++; } result.append(count > 1 ? ")" : "("); } return result.toString(); }
额外注意点
Java的matches()和部分其他语言的匹配逻辑不同:Java中matches()要求正则完全匹配整个输入字符串,而有些语言(比如JavaScript)的match()只要字符串中有匹配片段就会返回结果,这是你容易踩坑的原因之一。
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

