java - while (!scannerObject.hasNext(patternObject)) 仅适用于一次迭代
问题描述
问题
我只能从由条件while
控制的循环中获得一次成功的迭代。hasNext(Pattern pattern)
我尝试使用.next()
但未成功“清除”输入流(?)。
行为
如果我第一次输入无效输入,看似有效的后续输入继续执行该System.out.print("You did not enter a valid size. Try again: ")
行。但是这一行应该只在Scanner getPizzaSize
没有有效输入的情况下执行。
相反,如果我第一次输入有效输入,它会工作并且程序会前进,但是当while (orderingPizza)
第二次迭代出现时,所有输入getPizzaSize
(有效或无效)都会执行System.out.print("You did not enter a valid size. Try again: ")
行。
我只从我的!getPizzaSize.hasNext(validPizzaSizes)
循环中获得了一次成功的迭代:
Please place the order for your pizza.
Size (s = small, l = large, f = family): s
Please place the order for your pizza.
Size (s = small, l = large, f = family): s
You did not enter a valid size. Try again:
我应该得到:
Please place the order for your pizza.
Size (s = small, l = large, f = family): s
Please place the order for your pizza.
Size (s = small, l = large, f = family): s
Please place the order for your pizza.
Size (s = small, l = large, f = family):
(我使用的正则表达式应该匹配:s、S、l、L、f、F。这个链接可能是为了测试结果:https://regexr.com/5gdla。)
一个办法
如果我Scanner getPizzaSize
在.hasNext(Pattern pattern)
循环中重新声明,循环将按预期运行:
- 无效输入后跟
You did not enter valid input . . . try again
; 和 - 有效的输入通过程序推进
我想了解的
我从getPizzaSize
with读取的方式似乎存在问题.next()
。但我不知道问题是什么。是我的正则表达式吗?.next()
关于结合的性质的东西.hasNext(Pattern pattern)
?对于整数输入,.hasNextInt()
并且.next()
工作完美。
import java.util.Scanner;
import java.util.regex.Pattern;
public class PizzaOrder{
public static void main(String[] args) {
// Initialise Scanner object.
Scanner getPizzaSize = new Scanner(System.in);
// Initialise Pattern object for detecting valid size input.
Pattern validPizzaSizes = Pattern.compile("^[slf]$", Pattern.CASE_INSENSITIVE);
while (true) {
// Ask for pizza size.
System.out.print("Please place the order for your pizza.\n" +
"Size (s = small, l = large, f = family): ");
// Validate size input.
while (!getPizzaSize.hasNext(validPizzaSizes)) {
System.out.print("You did not enter a valid size. Try again: ");
getPizzaSize.next();
}
// Set pizza size.
String pizzaSize = getPizzaSize.next();
}
}
}
解决方案
您的正则表达式是说“s”、“l”或“f”必须是字符串的开头和结尾,如^
and$
锚点所示。但是,就扫描仪而言,s
您输入的第二个不是字符串的开头。它在您输入的第一个之后s
(可能也由行分隔符分隔)!
你不应该使用^
锚。您的正则表达式应该是:
[slf]$
这也解释了为什么创建新的扫描仪有效。因为新扫描仪不知道s
您输入的前一个扫描仪。
推荐阅读
- amazon-web-services - 有没有办法直接在 session.NewSession() 中传递凭证而无需 AWS Config 文件?
- python-3.x - Python 受保护的成员变量
- laravel - 如何从最接近今天的时期获取不同日期时期不同价格的产品的默认价格?
- git-review - git review error ValueError: 没有收盘价
- scala - 根据名称将方法转换为枚举值
- python - Pyqt5 中的 SetText
- reactjs - 如何在 switch case 中调用 API
- wordpress - WordPress 分页 get_query_var( 'paged' ) 总是返回第一页
- python - How to get a log function fit using Scipy curve_fit for the data
- google-apps-script - 如何修复谷歌表格中损坏的导入在线excel?