如何确定一个字符串是否包含非字母数字字符?

83

我需要一种方法,可以告诉我一个字符串是否包含非字母数字字符。

例如,如果字符串是“abcdef?”或“abcdefà”,该方法必须返回true。


1
https://dev59.com/cXI-5IYBdhLWcg3wj5FG - Wojciech Owczarczyk
https://dev59.com/jGgu5IYBdhLWcg3wj3v5 - treecoder
9个回答

163

使用Apache Commons Lang:

!StringUtils.isAlphanumeric(String)

或者迭代字符串的字符并使用以下方式进行检查:

!Character.isLetterOrDigit(char)

你还有一个问题:

你的示例字符串 "abcdefà" 是字母数字组合,因为 à 是一个字母。但我想你希望它被视为非字母数字字符,是吗?!

因此,你可能需要使用正则表达式来解决:

String s = "abcdefà";
Pattern p = Pattern.compile("[^a-zA-Z0-9]");
boolean hasSpecialChar = p.matcher(s).find();

7
如果没有必要,我希望避免导入外部库。是的:我希望将 à 视为非字母数字字符。 - lugeno
一个旁注: 无关紧要,只是提醒 StringUtils.isAlphaNumeric("abc"); 如果字符串仅包含字母,则返回 true - Brooklyn99

29

一种方法是使用String类本身来实现。 假设你的字符串是这样的:

String s = "some text";
boolean hasNonAlpha = s.matches("^.*[^a-zA-Z0-9 ].*$");

另一种方法是使用外部库,例如Apache commons:

String s = "some text";
boolean hasNonAlpha = !StringUtils.isAlphanumeric(s);

+1:我认为正则表达式是赢家,因为OP并不真正想检查字母数字字符。他想要像hasSpecialCharacters(String)这样的东西,并使用自己定义的“特殊”字符。 - Fabian Barney
2
这样做不太行:在Java中,String.matches(...)检查正则表达式是否与整个字符串匹配。 - ruakh
boolean hasNonAlpha = ! … ^[A-Za-z0-9 ]*$ - Isaak Osipovich Dunayevsky

6

您需要逐个检查字符串中的每个字符,并检查 Character.isDigit(char);Character.isLetter(char);

或者,您可以使用正则表达式。


1
例如,“-1234”是一个数字,而不是字母数字字符串。但你的逻辑Character.isDigit将会返回“-”为false。:( - Abhishek
我认为应该是Character.isLetter而不是Character.isletter。 - InterLinked

4

使用此函数检查字符串是否为字母数字:

public boolean isAlphanumeric(String str)
{
    char[] charArray = str.toCharArray();
    for(char c:charArray)
    {
        if (!Character.isLetterOrDigit(c))
            return false;
    }
    return true;
}

这样做可以避免导入外部库,而且代码可以轻松修改,以便在以后需要对字符串执行不同的验证检查时使用。


2
如果您可以使用 Apache Commons 库,那么 Commons-Lang 的 StringUtils 类中有一个叫做 isAlphanumeric() 的方法可以完成您所需的功能。

1

string.matches("^\\W*$"); 可以满足你的需求,但它不包括空格。 string.matches("^(?:\\W|\\s)*$"); 包括空格。


0

虽然它不能用于数字,但您可以检查小写和大写值是否相同。对于非字母字符,它们将是相同的。在此之前,您应该先检查数字以获得更好的可用性。


0

你可以在Java.lang中使用Character类的isLetter(char c)静态方法。

public boolean isAlpha(String s) {
    char[] charArr = s.toCharArray();

    for(char c : charArr) {
        if(!Character.isLetter(c)) {
            return false;
        }
    }
    return true;
}

0
我必须检查一个字符串是否包含至少一个字母和一个数字 - 我的解决方案如下
/**
 * <p>Checks if the String contains both letters and digits.</p>
 *
 * <p>{@code null} will return {@code false}.
 * An empty String str.isEmpty() will return {@code false}.</p>
 *
 * @param str the String to check, may be null
 * @return {@code true} if only contains letters and digits,
 * and is non-null or not empty
 */
public static boolean isAlphaAndNumeric(String str) {
    if (str == null || str.isEmpty()) {
        return false;
    }

    Pattern pattern = Pattern.compile("^[a-zA-Z0-9]*$");
    boolean containsSpecialChars = !pattern.matcher(str).matches();
    if (containsSpecialChars) {
        return false;
    }
    
    boolean containsLetter = false;
    boolean containsDigit = false;
    char[] chars = str.toCharArray();
    int i = 0;
    while (i < chars.length) {
        if (Character.isLetter(chars[i])) {
            containsLetter = true;
        }
        if (Character.isDigit(chars[i])) {
            containsDigit = true;
        }
        i++;
        if (containsDigit && containsLetter) {
            return true;
        }
    }
    return false;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接