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

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

洞察?

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

更换

  if(scan.hasNextLine()){ 

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

如果你使用hasNextLine ,扫描仪只会检查它下面是否有任何东西 ,特别是对于字母或其他东西。

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

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

另外,使用scan.next()读取用户名,而不是nextLine() – 尽管您可能希望稍后调用nextLine()来清理该行的其余部分。 如果你使用nextLine()来读取用户名,那么字母后面可能会出现一些不是字母的内容,而且它将由nextLine()读取。

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

像这样的东西:

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

试试像“

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

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

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