получить всю строку с помощью java.util.scanner.hasNext (regex) - PullRequest
2 голосов
/ 24 апреля 2010

Я делаю в Java что-то, что требует сопоставления ввода с шаблоном ^ [1-5] $. У меня должен быть цикл while, проходящий по каждой строке ввода, проверяющий его по шаблону и выводящий сообщение об ошибке, если это не так.

Код Судо:

while (regex_match(/^[^1-5]$/,inputLine)) {  
    print ("Please enter a number between 1 and 5! ");  
    getNextInputLine();
}  

Я могу использовать java.util.Scanner.hasMatch("^[^1-5]$"), но это будет соответствовать только одному токену, а не всей строке. Есть идеи, как сделать так, чтобы hasMatch совпадал со всей строкой? (Установка разделителя на «\ n» или «\ 0» не работает.)

Редактировать: Если это невозможно, есть ли другой способ сделать это?

1 Ответ

5 голосов
/ 24 апреля 2010

Непонятно, что именно вы спрашиваете.

  • hasNextInt() может сказать вам, есть ли int nextInt(). Затем вы можете проверить, находится ли он между 1-5 и не запрашивать ли другой. Казалось бы, это самый чистый вариант, даже без использования регулярных выражений.

  • hasNext("[1-5]") может сказать вам, является ли полный следующий токен nextInt() между 1-5. Это на самом деле немного строго в том смысле, что если следующий токен, скажем, "005", он не совпадает. Вы можете сделать регулярное выражение более сложным, чтобы приспособиться к этому, но с этого момента первый вариант выше становится еще более привлекательным.

  • findInLine(String pattern) может найти шаблон, игнорируя разделители, пропуская любой ввод, который не совпадает. Вы можете извлечь число из ввода, например, "I want to buy 3 apples, please!". Это, вероятно, не то, что вам нужно (но это не ясно из вопроса).


Другая возможность состоит в том, что, возможно, вам нужен не только следующий токен ^[1-5]$, но и всей следующей строки , чтобы соответствовать этому. Если это так, то, возможно, вам нужно нечто подобное:

String line = scanner.nextLine();
if (!line.matches("^[1-5]$")) {
  // error message
} else {
  int num = Integer.parseInt(line);
}

Если вы хотите проверить, соответствует ли nextLine() этому шаблону без потребления этой строки, то вы можете сделать следующее:

if (scanner.findInLine("^[1-5]$") != null) {
  // nextLine().matches("[1-5]");
}
...