while(!hasnext(patternobject))只适用于一次迭代

km0tfn4u  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(321)

问题

我只从一个 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) 回路:

  1. Please place the order for your pizza.
  2. Size (s = small, l = large, f = family): s
  3. Please place the order for your pizza.
  4. Size (s = small, l = large, f = family): s
  5. You did not enter a valid size. Try again:

我应该得到:

  1. Please place the order for your pizza.
  2. Size (s = small, l = large, f = family): s
  3. Please place the order for your pizza.
  4. Size (s = small, l = large, f = family): s
  5. Please place the order for your pizza.
  6. 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() 完美地工作。

  1. import java.util.Scanner;
  2. import java.util.regex.Pattern;
  3. public class PizzaOrder{
  4. public static void main(String[] args) {
  5. // Initialise Scanner object.
  6. Scanner getPizzaSize = new Scanner(System.in);
  7. // Initialise Pattern object for detecting valid size input.
  8. Pattern validPizzaSizes = Pattern.compile("^[slf]$", Pattern.CASE_INSENSITIVE);
  9. while (true) {
  10. // Ask for pizza size.
  11. System.out.print("Please place the order for your pizza.\n" +
  12. "Size (s = small, l = large, f = family): ");
  13. // Validate size input.
  14. while (!getPizzaSize.hasNext(validPizzaSizes)) {
  15. System.out.print("You did not enter a valid size. Try again: ");
  16. getPizzaSize.next();
  17. }
  18. // Set pizza size.
  19. String pizzaSize = getPizzaSize.next();
  20. }
  21. }
  22. }
4szc88ey

4szc88ey1#

正则表达式表示“s”、“l”或“f”必须是字符串的开头和结尾,如 ^ 以及 $ 锚定。然而,就扫描仪而言,第二个 s 您输入的不在字符串的开头。在第一次之后 s 您输入了(可能还被行分隔符分隔)!
你不应该使用 ^ 锚定。你的正则表达式应该是:

  1. [slf]$

这也解释了为什么创建一个新的扫描仪工作。因为新的扫描仪不知道以前的 s 你进入的。

相关问题