首页 > 解决方案 > 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)循环中重新声明,循环将按预期运行:

  1. 无效输入后跟You did not enter valid input . . . try again; 和
  2. 有效的输入通过程序推进

我想了解的

我从getPizzaSizewith读取的方式似乎存在问题.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();
        }
    }
}
            

标签: javaregexjava.util.scanner

解决方案


您的正则表达式是说“s”、“l”或“f”必须是字符串的开头和结尾,如^and$锚点所示。但是,就扫描仪而言,s您输入的第二个不是字符串的开头。它在您输入的第一个之后s(可能也由行分隔符分隔)!

你不应该使用^锚。您的正则表达式应该是:

[slf]$

这也解释了为什么创建新的扫描仪有效。因为新扫描仪不知道s您输入的前一个扫描仪。


推荐阅读