Вопрос о Сканере Java

Как делают Вас, устанавливает разделитель для сканера к также; или новая строка?

Я попробовал: Scanner.useDelimiter(Pattern.compile("(\n)|;")); Но это не работает.

10
задан nhahtdh 12 January 2014 в 08:31
поделиться

3 ответа

Как правило, в шаблонах нужно удвоить \.

Итак, попробуйте

Scanner.useDelimiter(Pattern.compile("(\\n)|;"));`

или

Scanner.useDelimiter(Pattern.compile("[\\n;]"));`

Edit: Если \r\n, попробуйте:

Scanner.useDelimiter(Pattern.compile("[\\r\\n;]+"));

, что соответствует одному или нескольким из \r, \n и ;.

Примечание: Я не пробовал эти.

.
16
ответ дан 3 December 2019 в 16:10
поделиться

Как вы обнаружили, вам нужно искать DOS/сетевой стиль \r\n (CRLF) разделители строк вместо Unix-стиля \n (только LF). Но что, если текст содержит оба? Такое часто случается; на самом деле, когда я вижу источник именно этой страницы, я вижу оба варианта.

Нужно входить в привычку искать оба типа разделителей, а также старый стиль Mac \r (только CR). Вот один способ сделать это:

\r?\n|\r

Вставляя это в свой пример кода, вы получаете:

scanner.useDelimiter(";|\r?\n|\r");

Это предполагает, что вы хотите соответствовать ровно одной новой строке или точке с запятой за раз. Если вы хотите получить совпадение с одной или более , вы можете сделать это вместо:

scanner.useDelimiter("[;\r\n]+");

Обратите внимание, как я передал в регексе строку вместо Pattern; все регексы кэшируются автоматически, так что предварительная компиляция регекса не даст вам никакого прироста производительности.

9
ответ дан 3 December 2019 в 16:10
поделиться

Глядя на комментарий OP, похоже, что проблема была в другом окончании строки (\ r \ n или CRLF).

Вот мой ответ, который будет обрабатывать несколько точек с запятой и окончания строк в любом формате (может или не может быть желательным)

Scanner.useDelimiter(Pattern.compile("([\n;]|(\r\n))+"));

например. входной файл, который выглядит так:

1


2;3;;4
5

приведет к 1,2,3,4,5

Я пробовал обычные \ n и \\ n - оба работали в моем случае, хотя я согласен, если вам нужен нормальный обратная косая черта, которую вы хотели бы удвоить, так как это escape-символ. Так уж получилось, что в этом случае "\ n" становится желаемым символом с дополнительным '\' или без него

1
ответ дан 3 December 2019 в 16:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: