使用java.util.scanner验证输入

eufgjt7s  于 2021-07-08  发布在  Java
关注(0)|答案(6)|浏览(291)

这个问题在这里已经有了答案

如何使用java.util.scanner从system.in正确读取用户输入并对其执行操作(1个答案)
三年前关门了。
我正在从 System.in 使用 java.util.Scanner . 我需要验证输入,例如:
它必须是一个非负数
它一定是按字母顺序排列的
... 等
最好的办法是什么?

j0pj023g

j0pj023g1#

要检查字符串中的字母,可以使用正则表达式,例如:

someString.matches("[A-F]");

为了检查数字和阻止程序崩溃,我有一个非常简单的类,你可以在下面找到,在这里你可以定义你想要的值的范围。在这里

public int readInt(String prompt, int min, int max)
    {
    Scanner scan = new Scanner(System.in);

    int number = 0;

    //Run once and loop until the input is within the specified range.
    do 
    {
        //Print users message.
        System.out.printf("\n%s > ", prompt);

        //Prevent string input crashing the program.
        while (!scan.hasNextInt()) 
        {
            System.out.printf("Input doesn't match specifications. Try again.");
            System.out.printf("\n%s > ", prompt);
            scan.next(); 
        }

        //Set the number.
        number = scan.nextInt();

        //If the number is outside range print an error message.
        if (number < min || number > max)
            System.out.printf("Input doesn't match specifications. Try again.");

    } while (number < min || number > max);

    return number;
}
6fe3ivhb

6fe3ivhb2#

scanner.hasnext方法概述 java.util.Scanner 有很多 hasNextXXX 可用于验证输入的方法。以下是所有这些项目的简要概述: hasNext() -有代币吗? hasNextLine() -它是否有另一行输入?

对于java原语 hasNextInt() -它是否有可以解析为 int ?
还提供 hasNextDouble() , hasNextFloat() , hasNextByte() , hasNextShort() , hasNextLong() ,和 hasNextBoolean() 作为奖励,还有 hasNextBigInteger() 以及 hasNextBigDecimal() 整数类型也有重载来指定基数(例如十六进制)
基于正则表达式
hasNext(String pattern) hasNext(Pattern pattern)Pattern.compile 超载 Scanner 因为它是基于regex的。一个重要的特点是 useDelimiter(String pattern) ,它允许您定义分隔标记的模式。还有 find 以及 skip 忽略分隔符的方法。
下面的讨论将使regex尽可能简单,因此重点仍然是 Scanner .

示例1:验证正整数

下面是一个使用 hasNextInt() 验证阳性 int 从输入。

Scanner sc = new Scanner(System.in);
int number;
do {
    System.out.println("Please enter a positive number!");
    while (!sc.hasNextInt()) {
        System.out.println("That's not a number!");
        sc.next(); // this is important!
    }
    number = sc.nextInt();
} while (number <= 0);
System.out.println("Thank you! Got " + number);

下面是一个示例会话:
请输入正数!

那不是数字!
-3
请输入正数!
5
谢谢您!有5个
注意要容易得多 Scanner.hasNextInt() 是用来比较冗长的
try/catch Integer.parseInt / NumberFormatException 联合体。根据合同 Scanner 保证如果 hasNextInt() ,那么 nextInt() 会和平地给你的 int ,不会扔任何东西 NumberFormatException / InputMismatchException / NoSuchElementException .

相关问题

如何使用scanner只接受有效的int作为输入
当输入错误的类型时,如何防止扫描器抛出异常( java 语)

示例2:同一令牌上有多个hasnext

请注意,上面的代码段包含 sc.next() 提前付款声明 Scanner 直到它 hasNextInt() . 重要的是要意识到 hasNextXXX 方法推进 Scanner 没有任何输入!您会发现,如果您从代码段中省略这一行,那么它将进入无效输入的无限循环!
这有两个后果:
如果您需要跳过失败的“垃圾”输入 hasNextXXX 测试,然后你需要提前 Scanner 以这样或那样的方式(例如。 next() , nextLine() , skip 等)。
如果有 hasNextXXX 测试失败了,你仍然可以测试,如果它可能 hasNextYYY !
下面是一个执行多个 hasNextXXX 测验。

Scanner sc = new Scanner(System.in);
while (!sc.hasNext("exit")) {
    System.out.println(
        sc.hasNextInt() ? "(int) " + sc.nextInt() :
        sc.hasNextLong() ? "(long) " + sc.nextLong() :  
        sc.hasNextDouble() ? "(double) " + sc.nextDouble() :
        sc.hasNextBoolean() ? "(boolean) " + sc.nextBoolean() :
        "(String) " + sc.next()
    );
}

下面是一个示例会话:
5
(内景)5

(布尔值)false
废话
(弦)诸如此类
1.1
(双)1.1
100000000000
(长)10000000000
出口
请注意,测试的顺序很重要。如果
Scanner hasNextInt() ,然后它也 hasNextLong() ,但不一定 true 另一方面。通常情况下,您希望在更一般的测试之前进行更具体的测试。

例3:验证元音 Scanner 具有正则表达式支持的许多高级功能。下面是一个用它来验证元音的例子。

Scanner sc = new Scanner(System.in);
System.out.println("Please enter a vowel, lowercase!");
while (!sc.hasNext("[aeiou]")) {
    System.out.println("That's not a vowel!");
    sc.next();
}
String vowel = sc.next();
System.out.println("Thank you! Got " + vowel);

下面是一个示例会话:
请输入元音,小写!
5
那不是元音!
z
那不是元音!
e
谢谢您!找到e了吗
在regex中,作为java字符串文本,模式 "[aeiou]" 是所谓的“字符类”;它匹配任何一个字母 a , e , i , o , u . 请注意,使上面的测试不区分大小写很简单:只需向 Scanner .

api链接 hasNext(String pattern) -退货 true 如果下一个标记与从指定字符串构造的模式匹配。 java.util.regex.Pattern ####相关问题

在java中读取单个字符

参考文献

java教程/基本类/正则表达式
regular-expressions.info/字符类

例4:同时使用两台扫描仪

有时你需要逐行扫描,一行有多个标记。最简单的方法是使用两个 Scanner ,第二个 Scanner 接受 nextLine() 从一开始 Scanner 作为输入。举个例子:

Scanner sc = new Scanner(System.in);
System.out.println("Give me a bunch of numbers in a line (or 'exit')");
while (!sc.hasNext("exit")) {
    Scanner lineSc = new Scanner(sc.nextLine());
    int sum = 0;
    while (lineSc.hasNextInt()) {
        sum += lineSc.nextInt();
    }
    System.out.println("Sum is " + sum);
}

下面是一个示例会话:
给我一行数字(或“退出”)
3 4 5
总数是12
10亿美元
总数是110
等等什么?
总和为0
出口
除了 Scanner(String) 构造函数,还有 Scanner(java.io.File) 在其他中。

摘要 Scanner 提供了一组丰富的功能,例如 hasNextXXX 验证方法。

正确使用 hasNextXXX/nextXXX 组合意味着 Scanner 永远不会扔垃圾 InputMismatchException / NoSuchElementException .
永远记住这一点 hasNextXXX 不推进 Scanner 通过任何输入。
不要羞于创建多个 Scanner 如有必要。两个简单的 Scanner 往往比一个过于复杂的 Scanner .
最后,即使您不打算使用高级regex特性,也要记住哪些方法是基于regex的,哪些不是。任何 Scanner 方法需要 String pattern 参数是基于正则表达式的。
小贴士:一个简单的方法来扭转任何 String 变成文字模式是 Pattern.quote 是的。

c6ubokkw

c6ubokkw3#

如果您是从控制台或类似的地方解析字符串数据,最好的方法是使用正则表达式。请在此处阅读更多信息:http://java.sun.com/developer/technicalarticles/releases/1.4regex/
否则,要从字符串解析int,请尝试integer.parseint(string)。如果字符串不是数字,则会出现异常。否则,您可以对该值执行检查,以确保它不是负值。

String input;
int number;
try
{
    number = Integer.parseInt(input);
    if(number > 0)
    {
        System.out.println("You positive number is " + number);
    }
} catch (NumberFormatException ex)
{
     System.out.println("That is not a positive number!");
}

要获得一个只包含字符的字符串,最好是在每个字符上循环检查数字,例如character.isleter(char)。

String input
for(int i = 0; i<input.length(); i++)
{
   if(!Character.isLetter(input.charAt(i)))
   {
      System.out.println("This string does not contain only letters!");
      break;
   }
}

祝你好运!

suzh9iv8

suzh9iv84#

我尝试的是,首先我接受整数输入,检查它是否为负,如果为负,然后再次接受输入

Scanner s=new Scanner(System.in);

    int a=s.nextInt();
    while(a<0)
    {
    System.out.println("please provide non negative integer input ");
    a=s.nextInt();
    }
    System.out.println("the non negative integer input is "+a);

在这里,您需要首先获取字符输入,并检查用户是否提供了字符,如果没有,则再次获取字符输入

char ch = s.findInLine(".").charAt(0);
    while(!Charcter.isLetter(ch))
    {
    System.out.println("please provide a character input ");
    ch=s.findInLine(".").charAt(0);
    }
    System.out.println("the character  input is "+ch);
6vl6ewon

6vl6ewon5#

这里有一个最简单的方法。

System.out.print("Please enter an integer: ");
while(!scan.hasNextInt()) scan.next();
int demoInt = scan.nextInt();
xam8gpfp

xam8gpfp6#

一个想法:

try {
    int i = Integer.parseInt(myString);
    if (i < 0) {
        // Error, negative input
    }
} catch (NumberFormatException e) {
    // Error, not a number.
}

在commons lang库中,还有charutils类提供方法 isAsciiNumeric() 检查字符是否为数字,以及 isAsciiAlpha() 要检查字符是否为字母。。。

相关问题