【问题标题】:User Input Validation, enforcing a string containing only letters用户输入验证,强制只包含字母的字符串
【发布时间】:2015-01-27 21:28:18
【问题描述】:

我试图在我的一种方法中创建一个用户输入验证系统......它在一定程度上可以正常工作,但尽管有代码,它仍然允许整数作为有效输入,我不希望它是,我如何更改此代码,仅允许字母(字符串)作为有效输入。在这一点上我很困惑,我用整数尝试了这个系统,它可以完美地工作,但是用字母,无济于事。

洞察力?

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;    
    }

}

【问题讨论】:

  • 您在哪里检查用户输入的是字母而不是数字?
  • 你考虑过正则表达式吗?
  • 是的,我希望他们只使用字母
  • dmitry,你是什么意思?
  • 我的意思是 Java 提供的 API 来检查字符串内容 (docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html) 并且您可以指定的规则非常广泛 - 包括没有任何数字符号。也许这就是你需要的。

标签: java validation input


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    替换

                if(scan.hasNextLine()){
    

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

    如果您使用hasNextLine,扫描仪只会检查接下来是否有任何东西,而不是特别针对字母或其他任何东西。

    当您使用正则表达式时,在这种情况下p{Alpha}* 表示“零个或多个字母”(但扫描仪会查找至少一个不是空格的字符,因此它实际上是“1 个或多个字母”),当您对hasNextInt()(正在寻找数字)执行相同操作时,扫描仪的行为与它非常相似。

    请注意,它只接受 US-ASCII 范围内的字母,因此没有重音符号或北欧字母或类似的东西,只接受 a-zA-Z

    另外,使用scan.next() 读取用户名,而不是nextLine() - 尽管您可能想稍后调用nextLine() 来清理其余的行。如果你用nextLine()读用户名,后面的字母可能不是字母,会被nextLine()读。

    【讨论】:

      【解决方案3】:

      试试类似“

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

      【讨论】:

        【解决方案4】:

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

        类似这样的:

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

        【讨论】:

        • 这只会查看第一个字符。
        • 对 :) 并没有真正检查代码 :) 我已经做出了改变 :)
        • 现在检查...它已修复 :) 只是不需要 else 语句
        猜你喜欢
        • 2013-04-28
        • 2012-09-07
        • 1970-01-01
        • 2016-06-12
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        相关资源
        最近更新 更多