java - 如何使用 Scanner.hasNextInt() 检查接下来的 3 个输入是否为 int 并仅在 java 中循环

标签 java regex java.util.scanner

如何检查用户给出的下三个输入是否是 int 值, 假设有三个变量,

  • var1
  • var2
  • var3

我将输入视为,

扫描仪 sc = 新扫描仪 (System.in); var1 = sc.nextInt(); var2 = sc.nextInt(); var3 = sc.nextInt();

现在,如果我想使用 while(sc.hasNextInt()) 来确定下一个输入是否是 int 那么它只会检查 var1 的下一个输入是否是 int并且不会检查其他变量 var2var3。通过使用 while 循环if (条件) 可以完成一件事。例如,

Scanner sc = new Scanner (System.in);
while (sc.hasNextInt()) {
   var1 = sc.nextInt();
   if (sc.hasNextInt()) {
      var2 = sc.nextInt();
      if (sc.hasNextInt()) {
         var3 = sc.nextInt();
      }
   }
 }

但这看起来很长,需要写很多东西。对于我在 Language C 中看到的类似问题,有一个 scanf() 方法可以解决这个问题。例如,

while(scanf("%d %d %d", &var1, &var2 & var3) == 3) { //这里的语句 }

所以我的问题是java的Scanner.hasNextIntScanner.hasNext("regex")中是否有此类功能

我也尝试过 sc.hasNext("[0-9]* [0-9]* [0-9]*") 但实际上并没有起作用。

提前谢谢您。

最佳答案

hasNext(regex) 仅测试单个标记。问题是默认分隔符是一个或多个空格,因此 number number number 不能是单个标记(分隔符 - 空格 - 不能是其中的一部分)。因此,每次 sc.hasNext("[0-9]* [0-9]* [0-9]*") 最终只会测试单个number。顺便说一句,您的模式 * 可能应该是 + 因为每个数字都应该至少有一位数字。

为了让空格成为标记的一部分,我们需要将它们从分隔符模式中删除。换句话说,我们需要将分隔符模式替换为仅表示行分隔符的分隔符模式,例如 \R ( more info )。这样,如果用户在一行中写入数据(仅在第三个数字后使用 Enter),该行将被视为单个标记,并且可以通过正则表达式进行测试。

稍后您需要将分隔符设置回一个或多个空格 (\s+),因为 nextInt 也基于单个标记,因此如果没有它,我们最终会尝试解析像 "1 2 3" 这样的字符串。

Scanner sc = new Scanner(System.in);
sc.useDelimiter("\\R");
System.out.print("Write 3 numbers (sepate them with space): ");
while(!sc.hasNext("\\d+ \\d+ \\d+")){
    String line = sc.nextLine();//IMPORTANT! Consume incorrect values
    System.out.println("This are not 3 numbers: "+line);
    System.out.print("Try again: ");
}
//here we are sure that there are 3 numbers
sc.useDelimiter("\\s+");//nextInt can't properly parse "num num num", we need to set whitespaces as delimiter

int var1 = sc.nextInt();
int var2 = sc.nextInt();
int var3 = sc.nextInt();

System.out.println("var1=" + var1);
System.out.println("var2=" + var2);
System.out.println("var3=" + var3);

此解决方案可能存在的问题是 \d+ 会让用户提供任意长度的数字,该数字可能超出 int 范围。如果您只想接受 int,请查看 Regex for a valid 32-bit signed integer 。您也可以使用 nextLong 代替,因为 long 的范围更大,但仍然有最大值。要接受任何整数,无论​​其长度如何,您都可以使用 nextBigInteger()

关于java - 如何使用 Scanner.hasNextInt() 检查接下来的 3 个输入是否为 int 并仅在 java 中循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52264138/

相关文章:

java - 如何通过java代码连接sql server?

Javascript正则表达式获取类名

java - 如何为正则表达式组绑定(bind) +/* ?

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - 在 Java 中使用位串设置问题

java - 如何在java中用 "\\t"分割字符串

java - SELECT COUNT(*) FROM (SELECT) AS SubQuery 在 MS ACCESS 中有效,但在 JDBC 中无效

java - 是否可以通过不同的方法写入同一个文件?

Javascript 正则表达式 : test people's name

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?