Почему шаблон регулярного выражения [1-3] \\ s + [1-3] не соответствует двум числам, разделенным пробелами, при использовании в коде - PullRequest
0 голосов
/ 13 июля 2020

В рамках моего проекта у меня есть метод, который проверяет и возвращает пользовательский ввод (с консоли 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};
    }

Извините, если мне не хватает чего-то очевидного, но что я делаю неправильно? А как правильно сделать?

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Как упоминал andreoss, вам нужно изменить разделитель, также есть ошибка в рекурсии. Вот модифицированный код:

private static byte[] checkAndGetMoveInput(Scanner input) {
    System.out.print("Enter the coordinates: ");
    Scanner _input = new Scanner(input.nextLine());
    _input.useDelimiter("$");

    if (_input.hasNext("[0-9]+\\s+[0-9]+")) {
        if (_input.hasNext("[1-3]\\s+[1-3]")) {
            _input.useDelimiter("\\s");
            byte x = _input.nextByte();
            byte y = _input.nextByte();
            return new byte[]{x, y};
        } else {
            System.out.println("Coordinates should be from 1 to 3!");
            return checkAndGetMoveInput(input);
        }
    } else {
        System.out.println("You should enter numbers!");
        return checkAndGetMoveInput(input);
    }
}
0 голосов
/ 13 июля 2020

Scanner уже разделяет ваш ввод пробелами.

Вам нужно указать другой разделитель, чтобы использовать его с вашим шаблоном.

final Scanner scanner = new Scanner(... );
scanner.useDelimiter(Pattern.compile("$")); // scan until new line
final Pattern pair = Pattern.compile("[1-3]\\s+[1-3]");
while (scanner.hasNext()) {
    final String line = scanner.next();
    final Matcher matcher = pair.matcher(line);
    while (matcher.find()) {
        System.out.println(matcher.group());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...