用户输入验证,强制执行仅包含字母的字符串

时间:2014-11-29 11:53:03

标签: java validation input

我试图在我的一个方法中创建一个用户输入验证系统...它的工作正常,但是尽管有代码,它仍然允许整数作为有效输入,我不希望它,我怎么能改变这段代码,只允许字母(字符串)作为有效输入。在这一点上我感到困惑,我尝试使用这个系统整数,它完美无缺,但有字母,无济于事。

洞察?

public class Player {

    private static String userName;
    private Scanner scan = new Scanner(System.in);
    private boolean validInput = false;

    public void createUser(){

        do {
        System.out.println("Please enter you name : ");
                if(scan.hasNextLine()){
                    userName = scan.nextLine();
                    validInput = true;
                } else {
                    System.out.println("You can only use letters!");
                    validInput = false;
                    scan.next();
                }
    } while (!(validInput));
        System.out.println(getUser());
    }
    static void setUser(String userName){
        Player.userName = userName; 
    }
    String getUser(){
        return userName;    
    }

}

4 个答案:

答案 0 :(得分:2)

替换

            if(scan.hasNextLine()){

            if(scan.hasNext("\\p{Alpha}*")){

如果您使用hasNextLine,扫描仪只会检查下一步是否 ,尤其是字母或其他内容。

使用正则表达式时,在这种情况下p{Alpha}*表示"零个或多个字母" (但是扫描仪会查找至少一个不是空格的字符,因此它实际上是"一个或多个字母"),扫描仪的行为与使用{{{ 1}}(正在寻找数字)。

请注意,它只接受US-ASCII范围内的字母,所以没有重音或北欧字母或类似的字母,只有hasNextInt()

此外,请使用a-zA-Z而不是scan.next()阅读用户名 - 尽管您可能希望稍后再调用nextLine()来清除该行的其余部分。如果您使用nextLine()来阅读用户名,则字母后面可能会出现一些不是字母的内容,并且nextLine()会读取该字母。

答案 1 :(得分:0)

为您的代码添加一个实际扫描数字的方法......

类似的东西:

private boolean containsNumbers(String name) {
    char[] chars = name.toCharArray();
    for (char c : chars) {
        if (c > 47 && c < 58) {
            return true;
        }
    }
    return false;
}

答案 2 :(得分:0)

尝试类似“

的内容
if (!userName.matches(".*\\d+.*")) {
    System.out.println("Only strings no numbers");
}

答案 3 :(得分:0)

我将从Ubica获取代码。你也可以这样做。它是可读的:

private boolean containsNumbers(String name) {
    char[] chars = name.toCharArray();
    for (char c : chars) {
        if (Character.isDigit(c)) {
            return true;
        }
    }
    return false;
}