有人能指出我为什么这段代码不起作用

时间:2018-05-17 14:49:23

标签: android

   public boolean checkFormat(String username){

         ArrayList<Character> charList = new ArrayList<Character>();
        Collections.addAll(charList, '!', '$', '#', '@');

    //Check for special Character
    boolean containsSpecial = false;
    for(Character character: charList) {
        if (username.contains(Character.toString(character))) {
            containsSpecial = true;
        }
    }
    //Check for Letters
    int numberCharacters = 0;
    if(containsSpecial){
        for(int i=0; i<username.length();i++){
            String symbol = String.valueOf(username.charAt(i));

            //REGEX pattern Check
            Pattern pattern = Pattern.compile("[A-z]");
            Matcher matcher = pattern.matcher(symbol);

            if(matcher.matches()){
                numberCharacters++;
                System.out.println("Match: " + numberCharacters);
            }
        }
    }

    if(numberCharacters>2){
        return true;
    }
    else {
        return false;
    }
}

这段代码是什么意思?它说用户名应该至少3个字符对吗?因为无论何时我输入janice作为用户名我都会得到错误的用户名格式不正确

1 个答案:

答案 0 :(得分:0)

输入"janice"返回false,因为当输入不包含特殊字符时,计数循环根本不会执行,numberCharacters仍然设置为0。

您发布的代码对于它应该执行的操作非常低效。您可以尝试这样的事情:

public boolean checkFormat(String username){
    final int len = username.length();
    int charCount = 0;
    for (int i = 0; i < len; i++) {
        final char c = Character.toLowerCase(username.charAt(i));
        if (c >= 'a' && c <= 'z') {
            charCount++;
        }
    }
    return charCount > 2;
}

当然,还有其他方法可以做到这一点。这只是一种可能的方法。

目前尚不清楚您为特殊字符设想的角色,但如果您只想检查是否存在至少一个特殊字符,则可以按如下方式修改上述内容:

private static final Pattern SPECIALS = Pattern.compile("[!$#@]");

public boolean checkFormat(String username) {
    if (!SPECIALS.matcher(username).find()) {
        return false;
    }
    ... // the logic as before
}

当然,如果您的目标是拒绝包含任何特殊字符的字符串,请颠倒if测试的意义。

顺便说一句:如果你想使用正则表达式,你应该知道正则表达式[A-z]代表一个包含许多特殊字符的字符类。 (查阅ASCII或Unicode代码表以查看哪些代码。)如果要测试字母字符,请使用[A-Za-z]或仅[a-z]并将输入字符串转换为小写字母或设置不区分大小写模式的标志。