使用matches()检查字符串特定字符:非法字符过滤逻辑异常排查
嘿,我来帮你排查这个字符串校验的问题~你的代码确实是逻辑和细节上出了问题,导致了误判,咱们一步步来理清楚:
问题出在哪?
你的代码有两个核心错误:
- 字符截取不对:
w.substring(i, i)其实返回的是空字符串,因为substring的第二个参数是「不包含」的结束位置,要拿到第i个字符,应该用w.substring(i, i+1),或者更直接的String.valueOf(w.charAt(i))。 - 逻辑搞反了:你现在的逻辑是「只要找到一个合法字符就立刻返回true」,但需求是「所有字符都必须是合法的才返回true」。比如字符串
"a@",第一个字符是合法的,你的代码直接返回true,但实际上这个字符串里有非法的@,应该返回false才对。
修正后的两种写法
写法1:修正循环逻辑
遍历每个字符,只要发现一个非法的就返回false,等所有字符都检查完没问题,再返回true:
public static Boolean checkc(String word) { // 先处理空字符串的情况,根据你的需求调整,比如返回false或者抛异常 if (word == null || word.isEmpty()) { return false; } for (int i = 0; i < word.length(); i++) { char c = word.charAt(i); // 检查字符是否在合法范围内:大小写字母、数字、下划线 if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '_')) { return false; } } return true; }
写法2:用正则直接匹配整个字符串(更简洁)
其实不用循环,直接用matches()匹配整个字符串就行,正则表达式^[A-Za-z0-9_]+$能确保整个字符串的每一个字符都是合法的:
public static Boolean checkc(String word) { if (word == null || word.isEmpty()) { return false; } // matches()默认会匹配整个字符串,所以也可以写成word.matches("[A-Za-z0-9_]+") return word.matches("^[A-Za-z0-9_]+$"); }
小提示:
^表示字符串开头,$表示字符串结尾,加上它们能更明确地表示「整个字符串都要符合规则」,避免歧义。
测试验证
- 合法字符串
"abc123_"→ 返回true - 非法字符串
"a@b"→ 返回false - 全非法字符串
"!@#"→ 返回false - 空字符串
""→ 根据你写的逻辑返回false(可以按需调整)
内容的提问来源于stack exchange,提问作者Mick
相关产品推荐
相关产品推荐

