Как вы устанавливаете разделитель для сканера, либо; или новой линии?Вопрос сканера Java
Я пробовал: Scanner.useDelimiter(Pattern.compile("(\n)|;"));
Но это не работает.
Как вы устанавливаете разделитель для сканера, либо; или новой линии?Вопрос сканера Java
Я пробовал: Scanner.useDelimiter(Pattern.compile("(\n)|;"));
Но это не работает.
Как правило, в шаблонах вам необходимо удвоить \
.
Итак, попробуйте
Scanner.useDelimiter(Pattern.compile("(\\n)|;"));`
или
Scanner.useDelimiter(Pattern.compile("[\\n;]"));`
Редактировать: Если \r\n
проблема, вы можете попробовать это:
Scanner.useDelimiter(Pattern.compile("[\\r\\n;]+"));
, который соответствует один или несколько \r
, \n
, и ;
.
Примечание: Я не пробовал их.
Вы можете пойти в любом случае. Если вы используете две обратные косые черты, компилятор regex видит '\ n' и интерпретирует его как escape-последовательность для перевода строки. Если вы используете одну обратную косую черту, компилятор regex видит фактический символ перевода строки, который он соответствует буквально. Но я бы определенно пошел с версией символьного класса: '" [\\ n;] "или' "[\ n;]" '; его легче читать, а также более эффективно. –
@ Алан Мур: Ах, ладно ... Я просто предположил, что буквальный разрыв строки будет неверно истолкован. – Powerlord
Глядя на комментарий ОП, похоже, что это была другая строка, заканчивающаяся (\ r \ n или CRLF), которая была проблемой.
Вот мой ответ, который будет обрабатывать несколько точек с запятой и строки окончаний в любом формате (может или не может быть желателен)
Scanner.useDelimiter(Pattern.compile("([\n;]|(\r\n))+"));
например входной файл, который выглядит следующим образом:
1
2;3;;4
5
приведет к 1,2,3,4,5
Я попытался нормальной \ п и \\ п - оба работали в моем случае, хотя я согласен если вам нужна нормальная обратная косая черта, вы хотели бы удвоить ее, поскольку это символ побега. Так получилось, что в этом случае «\ n» становится желаемым символом с дополнительным «\»
Как вы обнаружили, вам нужно искать DOS/сетевой стиль \r\n
(CRLF) разделители строк вместо стиля Unix \n
(только для LF). Но что, если текст содержит оба? Это происходит много; на самом деле, когда я рассматриваю источник этой самой страницы, я вижу обе разновидности.
Вы должны привыкнуть искать оба вида разделителя, а также старый стиль Mac \r
(только CR). Вот один из способов сделать это:
\r?\n|\r
Подключив что в примере кода вы получите:
scanner.useDelimiter(";|\r?\n|\r");
Это предполагает, что вы хотите, чтобы соответствовать ровно один символ новой строки или точкой с запятой в то время.Если вы хотите, чтобы соответствовать одному или более вы можете сделать это вместо того, чтобы:
scanner.useDelimiter("[;\r\n]+");
Обратите внимание, также, как я перешел в регулярное выражение строки вместо паттерна; все регулярные выражения автоматически кэшируются, поэтому предварительная компиляция регулярного выражения не дает вам какого-либо выигрыша в производительности.
Нашел ошибку, я должен использовать (\ r \ n) | ;. Я разбирал что-то вроде этого: string; number \ r \ n ... и он не принимал что-то вроде 100 \ r как число. – Razvi