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

使用matches()检查字符串特定字符:非法字符过滤逻辑异常排查

嘿,我来帮你排查这个字符串校验的问题~你的代码确实是逻辑和细节上出了问题,导致了误判,咱们一步步来理清楚:

问题出在哪?

你的代码有两个核心错误:

  1. 字符截取不对:w.substring(i, i) 其实返回的是空字符串,因为substring的第二个参数是「不包含」的结束位置,要拿到第i个字符,应该用w.substring(i, i+1),或者更直接的String.valueOf(w.charAt(i))。
  2. 逻辑搞反了:你现在的逻辑是「只要找到一个合法字符就立刻返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:34:57