如何让扫描器循环直到它读取到所需的字符串?

How to get a scanner to loop until it reads a desired string?

        Scanner one = new Scanner(System.in);
        System.out.print("Enter Name: ");
        name = one.nextLine();
        System.out.print("Enter Date of Birth: ");
        dateofbirth = one.nextLine();
        System.out.print("Enter Address: ");
        address = one.nextLine();  
        System.out.print("Enter Gender: ");
        gender = //not sure what to do now

您好,我已经尝试自己解决这个问题,但我无法从其他示例中完全理解,大多数示例要么只接受某些字符,要么只接受 A-Z+a-z

我试图让程序只接受男性或女性的输入,忽略大小写,如果输入错误,重复 "Enter Gender:" 直到输入正确的值。

你可以把这段代码放一段时间,每次都验证一下。例如:

String gender;
do
{
  System.out.print("Enter Gender ('male' or 'female'): ");
  gender = one.nextLine().toLowercase();
} while(!gender.equals("male") && !gender.equals("female"))
do {
    System.out.print("Enter Gender (M/F): ");
    gender = one.nextLine();
} while (!gender.equalsIgnoreCase("M") && !gender.equalsIgnoreCase("F"));

您可以在分配性别后添加 if 检查以显示无效消息

一种方法是使用无限循环和标签来突破。
像这样:

//Start 
Scanner one = new Scanner(System.in);
here:
while (true){
System.out.print("Enter Gender: ");
    String str = one.nextLine();
        switch (str.toUpperCase()){
            case "MALE":
                System.out.println("Cool");
                break here;
            case "FEMALE":
                System.out.println("Nice");
                break here;
            default:
                System.out.println("Genders variants: Male/Female");
      }
}

public class 主要{

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("Enter Name: ");
    String name = readValue(scanner, null);
    System.out.print("Enter Date of Birth: ");
    String dateofbirth = readValue(scanner, null);
    System.out.print("Enter Address: ");
    String address = readValue(scanner, null);
    System.out.print("Enter Gender: ");
    String gender = readValue(scanner, createGenderMatcher());
}

private static IMatcher createGenderMatcher() {
    return new IMatcher() {
        @Override
        public boolean isMatch(String value) {
            return "male".equalsIgnoreCase(value) || "female".equalsIgnoreCase(value);
        }
    };
}

private static String readValue(Scanner scanner, IMatcher matcher) {
    String value = null;
    do {
        value = scanner.nextLine();
    } while (matcher != null && !matcher.isMatch(value));
    return value;
}

private interface IMatcher {
    public boolean isMatch(String value);
}