2009-12-30 4 views
9

Как вы устанавливаете разделитель для сканера, либо; или новой линии?Вопрос сканера Java

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

+0

Нашел ошибку, я должен использовать (\ r \ n) | ;. Я разбирал что-то вроде этого: string; number \ r \ n ... и он не принимал что-то вроде 100 \ r как число. – Razvi

ответ

15

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

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

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

или

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

Редактировать: Если \r\n проблема, вы можете попробовать это:

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

, который соответствует один или несколько \r, \n, и ;.

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

+1

Вы можете пойти в любом случае. Если вы используете две обратные косые черты, компилятор regex видит '\ n' и интерпретирует его как escape-последовательность для перевода строки. Если вы используете одну обратную косую черту, компилятор regex видит фактический символ перевода строки, который он соответствует буквально. Но я бы определенно пошел с версией символьного класса: '" [\\ n;] "или' "[\ n;]" '; его легче читать, а также более эффективно. –

+0

@ Алан Мур: Ах, ладно ... Я просто предположил, что буквальный разрыв строки будет неверно истолкован. – Powerlord

1

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

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

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

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

1 


2;3;;4 
5 

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

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

9

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

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

\r?\n|\r 

Подключив что в примере кода вы получите:

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

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

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

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

Смежные вопросы