bha*_*shi 39 java validation java.util.scanner
我正在System.in使用一个用户输入java.util.Scanner.我需要验证以下内容的输入:
最好的方法是什么?
pol*_*nts 138
Scanner.hasNextXXX方法概述java.util.Scanner有许多hasNextXXX方法可用于验证输入.以下是对所有这些内容的简要概述:
hasNext()- 它有任何令牌吗?hasNextLine() - 它有另一条输入线吗?hasNextInt()- 它有一个可以解析成一个令牌int吗?hasNextDouble(),hasNextFloat(),hasNextByte(),hasNextShort(),hasNextLong(),和hasNextBoolean()hasNextBigInteger()和hasNextBigDecimal()Scanner因为它是基于正则表达式的事实所以能够做得更多.一个重要的特性是useDelimiter(String pattern),它允许您定义分隔您的标记的模式.也有find和skip方法是忽略分隔符.
以下讨论将使正则表达式尽可能简单,因此重点仍然存在Scanner.
这是一个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);
Run Code Online (Sandbox Code Playgroud)
这是一个示例会话:
请输入正数!
5
这不是一个数字!
-3
请输入正数!
5
谢谢!得到5
注意Scanner.hasNextInt()与更详细try/catch Integer.parseInt/ NumberFormatException组合相比,使用起来容易多少.通过合同,Scanner 保证如果它hasNextInt(),那么nextInt()将和平地给你int,并且不会抛出任何NumberFormatException/ InputMismatchException/ NoSuchElementException.
hasNextXXX同一令牌上的多个请注意,上面的代码段包含一个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()
);
}
Run Code Online (Sandbox Code Playgroud)
这是一个示例会话:
5
(int)5
false
(布尔值)false
blah
(String)blah
1.1
(double)1.1
100000000000
(long)100000000000
exit
请注意,测试的顺序很重要.如果是Scanner hasNextInt(),那么它也是hasNextLong(),但它不一定true是相反的方式.通常情况下,您希望在更一般的测试之前进行更具体的测试.
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);
Run Code Online (Sandbox Code Playgroud)
这是一个示例会话:
请输入一个小写的元音!
5
那不是元音!
ž
这不是一个元音!
Ë
谢谢!得到了
在正则表达式中,作为Java字符串文字,模式"[aeiou]"是所谓的"字符类"; 它匹配任何字母a,e,i,o,u.请注意,使上面的测试不区分大小写是微不足道的:只需提供这样的正则表达式模式Scanner.
hasNext(String pattern)- true如果下一个标记与从指定字符串构造的模式匹配,则返回.java.util.regex.PatternScanner一次使用两个有时你需要逐行扫描,在一条线上有多个标记.做到这一点的最简单方法是使用2 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);
}
Run Code Online (Sandbox Code Playgroud)
这是一个示例会话:
给我一堆数字(或'退出')
3 4 5
总和是12
10 100百万美元
总和是
等待什么?
Sum是0
退出
除了Scanner(String)构造函数之外,还有Scanner(java.io.File)其他一些.
Scanner提供了丰富的功能,例如hasNextXXX验证方法.hasNextXXX/nextXXX组合意味着,Scanner将永远不会抛出InputMismatchException/ NoSuchElementException.hasNextXXX不会推进Scanner过去的任何输入.Scanner如果有必要,不要害羞创建多个.两个简单Scanner往往比一个过于复杂Scanner.Scanner带String pattern参数的方法都是基于regex的.
String转换为文字模式的简单方法就是Pattern.quote它.这是一种极简主义的方法。
System.out.print("Please enter an integer: ");
while(!scan.hasNextInt()) scan.next();
int demoInt = scan.nextInt();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
272499 次 |
| 最近记录: |