防止用户在Java中输入空格

防止用户在Java中输入空格,java,Java,我希望用户只输入他的年龄。所以我做了这个节目: Scanner keyb = new Scanner(System.in); int age; while(!keyb.hasNextInt()) { keyb.next(); System.out.println("How old are you ?"); } age = keyb.nextInt(); System.out.println("you are" + age + "years old"); 我发现了如何通过

我希望用户只输入他的年龄。所以我做了这个节目:

Scanner keyb = new Scanner(System.in);  
int age;

while(!keyb.hasNextInt())
{
    keyb.next();
    System.out.println("How old are you ?");
}

age = keyb.nextInt();
System.out.println("you are" + age + "years old");
我发现了如何通过使用keyb.hasNextInt()的while循环来防止用户使用字符串,但如何防止用户使用空格或输入超过其年龄的输入

例如,我想阻止这种类型的输入“12 m”或“12 12”

另外,如何清除缓冲区中的所有现有数据?当我尝试使用此选项时,我面临一个无限循环:

while(keyb.hasNext())
  keyb.next();

你想要整条线。使用下一行

String possibleAge = "";
do {
    System.out.println("How old are you ?");
    possibleAge = keyb.nextLine();
} while (!possibleAge.matches("\\d+"))

如果年龄包含其他then数字,则它将打印无效的年龄。

您的问题是
扫描仪的默认行为是使用任何空格作为分隔符。这包括空间。这意味着
a3a
实际上是三个标记,而不是一个。您可以将分隔符更改为新行,使
a 3 a
成为单个标记,然后将
hasNextInt
返回false

我还添加了一个初始问题,因为在您的示例中,第一次输入是在提出任何问题之前进行的

Scanner keyb = new Scanner(System.in);
keyb.useDelimiter("\n"); // You can try System.lineSeparator() but it didn't work in IDEA
int age;

System.out.println("How old are you?");
while(!keyb.hasNextInt())
{
    keyb.next();
    System.out.println("No really. How old are you?");
}

age = keyb.nextInt();
System.out.println("You are " + age + " years old");

阅读整行内容,然后检查输入的格式。如果不是您想要的,请再次请求输入。使用预编译的
模式可能更有效。As
String.matches
为每个call@OleV.V. 没关系,我是个白痴。我经常惊讶于扫描器的行为是多么违反直觉。难怪这么多初学者都被它难倒了。@Spn
“\\d+”
是一个正则表达式。它基本上是检查字符串是否匹配某个模式/格式。在这种情况下,
\\d
表示数字(因此
0-9
)。
+
表示一个或多个。因此,它会检查用户输入的行是否正好是1个或多个数字,而不是其他数字。小注释(虽然现在可能有点太高级了,但主要是为其他读者添加的):
String#matches
添加一个隐式的前导
^
和尾随
$
,以正则表达式检查整个字符串。@Spn您始终可以使用
Integer#parseInt
将字符串解析为整数,
\\d+
是一个正则表达式。双\\用于java编译器。另外,这正是您希望使用字符串的情况。@Spn
[0-9]
与\\d相同。我从您的答复中学到了很多,谢谢!但是我想知道,如果我想回到默认的分隔符,我只需要键入keyb.useDelimiter(“”),对吗?@Spn不太对。“任何空白”不仅限于空格,还包括制表符、新行等。要恢复到原来的状态,可以使用
“\\p{javaWhitespace}+”
。但是不要这样做-你可以简单地打电话给我,我试过你的程序,它不起作用。。它一直问我“不,真的。你多大了?”@Spn-Hm,对我来说很好。它可能是分隔符-它依赖于系统。您也可以尝试
\r
\r\n
我有windows所以\r\n可以工作(\r也可以)。非常感谢。
Scanner keyb = new Scanner(System.in);
keyb.useDelimiter("\n"); // You can try System.lineSeparator() but it didn't work in IDEA
int age;

System.out.println("How old are you?");
while(!keyb.hasNextInt())
{
    keyb.next();
    System.out.println("No really. How old are you?");
}

age = keyb.nextInt();
System.out.println("You are " + age + " years old");