将 charAt 检查 'containing A-Z' 转换为 'not containing A-Z'

Converting charAt check 'containing A-Z' to 'not containing A-Z'

我想检查字符串输入是否包含字母以外的字符。以下是我当前的代码:

if ((name.charAt(i) >= 'a' && name.charAt(i) <= 'z') ||
 ((name.charAt(i) >= 'A' && name.charAt(i) <= 'Z')))

我如何更改代码,使其起到检查 name.charAt(i) 是否不等于 AZaz?

直接否定你的条件:

if (!((name.charAt(i) >= 'a' && name.charAt(i) <= 'z') || ((name.charAt(i) >= 'A' && name.charAt(i) <= 'Z'))))
    String str = "1234";
    if(!str.matches("[a-zA-Z]+")){
        System.out.println("not contains alphabets");
    }else{
        System.out.println("contains alphabets");
    }

我将演示一个系统的方法来解决这个问题,它可以在其他类似情况下为您提供帮助。首先,为了提高可读性,将 char 提取到本地变量。

char ch = name.charAt(i);
if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') ...

现在您可以根据 DeMorgan 定律处理此问题。为了使事情更容易,我将为每个部分声明一些辅助布尔变量:

boolean a = ch >= 'a', 
        z = ch <= 'z', 
        A = ch >= 'A', 
        Z = ch <= 'Z';

所以,我们有你的原始表达式

(a && z) || (A && Z)

我们想要那个表达式的负数:

!(a && z || A && Z)

让我们把它清理干净。应用

获得

 !(a && z) && !(A && Z)

然后申请

到内部表达式:

(!a || !z) && (!A || !Z)

现在将原来的表达式代回,取反 <=>>=<:

(ch < 'a' || ch > 'z') && (ch < 'A' || ch > 'Z')

这是您正在寻找的否定表达式,清除了任何明确的否定。

不用比较大小写字符,而是使用 Character.isLetter(char c) 方法,因为它会检查两种情况。

    char[] chars = name.toCharArray();
         boolean isAlphabet = true;
        for (char c : chars) {
           if (!Character.isLetter(c)) {
               //if character is not A-Z or a-z
                isAlphabet = false;
                    }
    }