Правильное регулярное выражение для предотвращения возврата сканером Java строки нулевой длины - PullRequest
1 голос
/ 22 января 2012

Я пытаюсь прочитать отдельные номера из файла с несколькими строками чисел, разделенных запятыми. Явский код, с которым я делаю это:

try {
        Scanner fileScanner = new Scanner(new FileReader(unsolvedBoardLocation));
        Pattern myPattern = Pattern.compile("[,\\r\\n]");
        System.out.println(myPattern.pattern());
        fileScanner.useDelimiter(myPattern);

        while(fileScanner.hasNext()) {
            int i = fileScanner.nextInt();
            System.out.print(i);

        }
    }
    catch(IOException ex) {
        Logger.getLogger(SudokuBoard.class.getName()).log(Level.SEVERE, null, ex);
    }

Содержимое файла, который я читаю, не имеет пробелов и выглядит следующим образом:

8,0,0,9,3,0,0,0,2
0,0,9,0,0,0,0,4,0

Поскольку я создал текстовый файл в Windows, я знаю, что после 2. в моей исходной версии программы сканер возвращал 2 \ r \ n, поэтому я добавил \ r \ n в разделитель, чтобы попытаться предотвратить это, но у меня все еще есть проблемы. Я получаю InputMissmatchException. Полная трассировка стека:

Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:909)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextInt(Scanner.java:2160)
at java.util.Scanner.nextInt(Scanner.java:2119)
at my.puzzle.sudoku.SudokuBoard.<init>(SudokuBoard.java:31)
at my.puzzle.sudoku.Sudoku.main(Sudoku.java:8)
    Java Result: 1

Я думаю, что причина, по которой я получаю это исключение, заключается в том, что сканер возвращает "" после конца 2. Это не то, что ожидает nextInt (), что выдает ошибку. Я пытаюсь предотвратить это, но я не уверен, как это сделать с помощью регулярных выражений. Так как я генерирую входной файл, я мог бы просто отформатировать его с пробелами и заставить его работать. Я также мог бы прочитать каждый токен как строку и проверить, можно ли прочитать строку как допустимое число, и перейти к следующему токену, если нет; однако для моих собственных целей обучения я хотел бы знать, как это можно сделать только с помощью регулярных выражений. Я уже читал Java-учебник по регулярным выражениям, но я никогда раньше не использовал регулярные выражения и испытываю трудности.

Для ясности, мой вопрос таков: "Как я могу предотвратить регулярное выражение в возвращении строки нулевой длины в этом сценарии".

Буду признателен за любую помощь, которую я смогу получить. Заранее спасибо!

1 Ответ

0 голосов
/ 29 января 2012

Завершите регулярное выражение $ или попробуйте \d.

...