В рамках моего проекта у меня есть метод, который проверяет и возвращает пользовательский ввод (с консоли System.in), если он правильный (и снова запрашивает ввод, если это не так). Правильный ввод - это пара цифр от 1 до 3 (включительно), разделенных пробелами. Для проверки ввода я использую метод hasNext(String pattern)
из класса Scanner с шаблоном регулярного выражения [1-3]\\s+[1-3]
(так что количество пробелов не имеет значения).
Все онлайн-тестеры регулярных выражений доказывают, что этот шаблон работает, если есть одна бакла sh ([1-3]\s+[1-3]
). Например: https://regexr.com/58bh6 и https://regex101.com/r/zcwpNx/1. Проведя небольшое исследование, я обнаружил, что в java вам нужно избегать escape-символа, чтобы он работал (что действительно сбивает с толку), следовательно, должно быть две обратные косые черты. Этот даже показывает преобразование из одной в две обратные косые черты для Java https://www.regexplanet.com/share/index.html?share=yyyydmcrhnr
Проблема в том, что он не хочет так работать. В любом случае он не хочет работать. Если есть один backsla sh, я получаю ошибку компиляции, а если есть два, метод просто не принимает ввод (https://onlinegdb.com/H1Ssexqkw). Я также пробовал использовать три и четыре обратной косой черты, но безуспешно.
Весь метод есть:
private static byte[] checkAndGetMoveInput(Scanner input){
byte x = -1, y = -1;
System.out.print("Enter the coordinates: ");
Scanner _input = new Scanner(input.nextLine());
if (_input.hasNext("[0-9]+")){
if (_input.hasNext("[1-3]\\s+[1-3]")) {
x = _input.nextByte();
y = _input.nextByte();
} else {
System.out.println("Coordinates should be from 1 to 3!");
checkAndGetMoveInput(input);
}
} else {
System.out.println("You should enter numbers!");
checkAndGetMoveInput(input);
}
return new byte[]{x, y};
}
Извините, если мне не хватает чего-то очевидного, но что я делаю неправильно? А как правильно сделать?