51

我正在System.in使用java.util.Scanner. 我需要验证以下内容的输入:

  • 它必须是一个非负数
  • 必须是字母
  • ... ETC

最好的方法是什么?

4

6 回答 6

154

Scanner.hasNextXXX方法概述

java.util.Scanner有许多hasNextXXX可用于验证输入的方法。以下是所有这些的简要概述:

Scanner由于它基于正则表达式这一事实,它能够实现更多功能。一个重要的特性是useDelimiter(String pattern),它可以让您定义分隔标记的模式。还有一些忽略分隔符findskip方法。

以下讨论将使正则表达式尽可能简单,因此重点仍然放在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()相比,使用起来容易得多。根据合同,a保证如果它,那么将和平地给你那个,并且不会扔任何// 。try/catch Integer.parseIntNumberFormatExceptionScanner hasNextInt()nextInt()intNumberFormatExceptionInputMismatchExceptionNoSuchElementException

相关问题


示例 2:hasNextXXX同一个令牌上的多个

请注意,上面的代码段包含一个sc.next()用于推进Scanneruntil it的语句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
(int) 5
false
(boolean) false
blah
(String) blah
1.1
(double) 1.1
100000000000
(long) 100000000000
退出

请注意,测试的顺序很重要。如果 a 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
谢谢!得到了

在正则表达式中,作为 Java 字符串文字,模式"[aeiou]"就是所谓的“字符类”;它匹配任何字母a, e, i, o, u。请注意,使上述测试不区分大小写是微不足道的:只需将这样的正则表达式模式提供给Scanner.

API 链接

相关问题

参考


示例 4:Scanner一次使用两个

有时您需要逐行扫描,一行上有多个标记。实现这一点的最简单方法是使用two Scanner,其中第二个ScannernextLine()第一个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 100 一百万美元
总和是 110
等等什么?
总和为 0
退出

除了Scanner(String)构造函数之外,还有Scanner(java.io.File)其他。


概括

  • Scanner提供了一组丰富的功能,例如hasNextXXX验证方法。
  • 正确使用hasNextXXX/nextXXX组合意味着 aScanner永远不会抛出InputMismatchException/ NoSuchElementException
  • 永远记住,hasNextXXX不推进Scanner过去的任何输入。
  • Scanner如有必要,不要害羞地创建多个。两个简单Scanner往往比一个过于复杂好Scanner
  • 最后,即使您没有任何使用高级正则表达式功能的计划,请记住哪些方法是基于正则表达式的,哪些不是。任何Scanner接受String pattern参数的方法都是基于正则表达式的。
    • 提示:将 anyString转换为文字模式的简单方法就是Pattern.quote它。
于 2010-06-17T06:27:24.043 回答
8

Here's a minimalist way to do it.

System.out.print("Please enter an integer: ");
while(!scan.hasNextInt()) scan.next();
int demoInt = scan.nextInt();
于 2014-05-23T23:46:43.080 回答
3

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

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;
}
于 2012-12-02T13:48:40.477 回答
1

一个想法:

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

commons-lang库中还有CharUtils类,它提供了isAsciiNumeric()检查字符是否为数字以及isAsciiAlpha()检查字符是否为字母的方法...

于 2010-06-17T06:30:17.170 回答
0

如果您从控制台或类似工具解析字符串数据,最好的方法是使用正则表达式。在此处阅读更多信息: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.isLetter(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;
   }
}

祝你好运!

于 2010-06-17T06:28:24.747 回答
0

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

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);
于 2017-04-04T11:07:21.910 回答