问题
我只从一个 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
与 .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();
}
}
}
1条答案
按热度按时间4szc88ey1#
正则表达式表示“s”、“l”或“f”必须是字符串的开头和结尾,如
^
以及$
锚定。然而,就扫描仪而言,第二个s
您输入的不在字符串的开头。在第一次之后s
您输入了(可能还被行分隔符分隔)!你不应该使用
^
锚定。你的正则表达式应该是:这也解释了为什么创建一个新的扫描仪工作。因为新的扫描仪不知道以前的
s
你进入的。