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

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

问题

我只从一个 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();
        }
    }
}
4szc88ey

4szc88ey1#

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

[slf]$

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

相关问题