使用java.util.Scanner验证输入

使用java.util.Scanner验证输入,java,validation,java.util.scanner,Java,Validation,Java.util.scanner,我使用java.util.Scanner从System.in中获取用户输入。我需要验证输入,例如: 它必须是一个非负数 它一定是按字母顺序排列的 。。。等 最好的方法是什么?扫描器概述。hasNextXXX方法 有许多可用于验证输入的方法。以下是所有这些项目的简要概述: -它有代币吗 -是否有其他输入行 对于Java原语 -它是否有可解析为int的令牌 还有、、和 作为奖励,还有和 整数类型还具有指定基数的重载(例如十六进制) 基于正则表达式的 超载了吗 Scanner能够实现

我使用
java.util.Scanner
System.in
中获取用户输入。我需要验证输入,例如:

  • 它必须是一个非负数
  • 它一定是按字母顺序排列的
  • 。。。等
最好的方法是什么?

扫描器概述。hasNextXXX方法 有许多可用于验证输入的方法。以下是所有这些项目的简要概述:

  • -它有代币吗
  • -是否有其他输入行
  • 对于Java原语
    • -它是否有可解析为
      int
      的令牌
    • 还有、、和
    • 作为奖励,还有和
    • 整数类型还具有指定基数的重载(例如十六进制)
  • 基于正则表达式的
    • 超载了吗
Scanner
能够实现更多功能,因为它基于regex。一个重要的特性是,它允许您定义分隔令牌的模式。还有忽略分隔符的
find
skip
方法

下面的讨论将使正则表达式尽可能简单,因此重点仍然是
Scanner


示例1:验证正整数 下面是一个使用
hasnetint()
验证输入的正
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);
下面是一个示例会话:

5
(int)5

(布尔值)false
废话
(字符串)废话 1.1
(双)1.1
10000000000
(长)10000000000
出口

请注意,测试的顺序很重要。如果一个
扫描器
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

在正则表达式中,作为Java字符串文本,模式
“[aeiou]”
就是所谓的“字符类”;它匹配任何字母
a
e
i
o
u
。注意,使上面的测试不区分大小写很简单:只需向
扫描器提供这样的正则表达式模式即可

API链接
  • -如果下一个标记与从指定字符串构造的模式匹配,则返回
    true
相关问题
工具书类

示例4:同时使用两个
扫描仪
有时您需要逐行扫描,一行上有多个令牌。实现这一点的最简单方法是使用两个
扫描仪
,其中第二个
扫描仪
从第一个
扫描仪
获取
nextLine()
作为输入。下面是一个例子:

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);
}
下面是一个示例会话:

给我一行数字(或“退出”)
34.5
总和为12
10 100万美元
总和为110
等等什么?
总和为0
出口

除了构造器,还有其他的


总结
  • Scanner
    提供了一组丰富的功能,例如用于验证的
    hasNextXXX
    方法
  • 正确组合使用
    hasNextXXX/nextXXX
    意味着
    扫描仪将永远不会抛出
    输入不匹配异常
    /
    无接触异常
  • 始终记住,
    hasNextXXX
    不会使
    扫描仪
    超过任何输入
  • 如有必要,不要羞于创建多个
    扫描仪。两个简单的
    扫描仪
    通常比一个过于复杂的
    扫描仪
    要好
  • 最后,即使您没有任何使用高级正则表达式功能的计划,也要记住哪些方法是基于正则表达式的,哪些不是。任何采用
    字符串模式
    参数的
    扫描器
    方法都是基于正则表达式的。
    • 提示:将任何
      字符串
      转换为文字模式的一种简单方法是使用它
扫描仪概述。hasNextXXX
方法 有许多可用于验证输入的方法。以下是所有这些项目的简要概述:

  • -它有代币吗
  • -是否有其他输入行
  • 对于Java原语
    • -它是否有可解析为
      int
      的令牌
    • 还有、、和
    • 作为奖励,还有和
    • 整数类型还具有指定基数的重载(例如十六进制)
  • 基于正则表达式的
    • 超载了吗
Scanner
能够实现更多功能,因为它基于regex。一个重要的特性是,它允许您定义分隔令牌的模式。还有忽略分隔符的
find
skip
方法

下面的讨论将使正则表达式尽可能简单,因此重点仍然是
Scanner


示例1:验证正整数 下面是一个使用
hasnetint()
验证输入的正
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);
这是一个
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!");
}
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;
   }
}
try {
    int i = Integer.parseInt(myString);
    if (i < 0) {
        // Error, negative input
    }
} catch (NumberFormatException e) {
    // Error, not a number.
}
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;
}
System.out.print("Please enter an integer: ");
while(!scan.hasNextInt()) scan.next();
int demoInt = scan.nextInt();
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);