Разделенная строка Java новой строкой - PullRequest
353 голосов
/ 18 января 2009

Я пытаюсь разделить текст в JTextArea с помощью регулярного выражения, чтобы разделить строку на \n Однако это не работает, и я также попытался использовать \r\n|\r|n и многие другие комбинации регулярных выражений. Код:

public void insertUpdate(DocumentEvent e) {
    String split[], docStr = null;
    Document textAreaDoc = (Document)e.getDocument();

    try {
        docStr = textAreaDoc.getText(textAreaDoc.getStartPosition().getOffset(), textAreaDoc.getEndPosition().getOffset());
    } catch (BadLocationException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    split = docStr.split("\\n");
}

Ответы [ 19 ]

667 голосов
/ 18 января 2009

Это должно охватить вас:

String lines[] = string.split("\\r?\\n");

На самом деле вам нужно беспокоиться только о двух новых строках (UNIX и Windows).

123 голосов
/ 18 января 2009

Если вы не хотите пустых строк:

String.split("[\\r\\n]+")
97 голосов
/ 25 июня 2015

split метод использует регулярные выражения (регулярные выражения). Поскольку Java 8 regex поддерживает \R, что представляет (из документации класса Pattern ):

Устройство для разрыва строки
\ R & emsp; & emsp; & emsp; & emsp; & emsp; & emsp; & emsp; Любая последовательность переноса строки Unicode, эквивалентна \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

Так что мы можем использовать его для соответствия:

Как видите, \r\n помещается в начало регулярного выражения, что гарантирует, что регулярное выражение будет пытаться сначала сопоставить эту пару , и только в случае неудачного совпадения оно будет пытаться сопоставить один символ разделители строк.


Так что, если вы хотите разделить на разделители строк, используйте split("\\R").

Если вы не хотите удалять из результирующего массива завершающие пустые строки "" используйте split(regex, limit) с отрицательным параметром limit, например split("\\R", -1).

Если вы хотите обработать одну или несколько непрерывных пустых строк как один разделитель, используйте split("\\R+").

44 голосов
/ 04 июля 2012
String.split(System.getProperty("line.separator"));

Это должно быть независимо от системы

11 голосов
/ 17 февраля 2012

Вам не нужно дублировать escape-символы в группах символов.

Для всех непустых строк используйте:

String.split("[\r\n]+")
7 голосов
/ 18 января 2009

Может быть, это будет работать:

Удаляет двойную обратную косую черту из параметра метода разделения:

split = docStr.split("\n");
7 голосов
/ 28 июня 2018

В String введен новый метод lines в , который возвращает Stream<String>

Возвращает поток подстрок, извлеченных из этой строки по ограничителям строки.

Распределителями строки распознаются перевод строки "\ n" (U + 000A), каретка возврат "\ r" (U + 000D) и возврат каретки, сопровождаемый немедленно перевод строки "\ r \ n" (U + 000D U + 000A).

Вот несколько примеров:

jshell> "lorem \n ipusm \n sit".lines().forEach(System.out::println)
lorem
 ipusm
 sit

jshell> "lorem \n ipusm \r  sit".lines().forEach(System.out::println)
lorem
 ipusm
  sit

jshell> "lorem \n ipusm \r\n  sit".lines().forEach(System.out::println)
lorem
 ipusm
  sit

Строка # строки ()

5 голосов
/ 01 декабря 2018

В JDK11 класс String имеет метод lines():

Возвращает поток строк, извлеченных из этой строки, разделенных ограничители строки.

Далее в документации говорится:

Терминатор строки может быть одним из следующих: символ перевода строки "\ n" (U + 000A), символ возврата каретки "\ r" (U + 000D) или каретка Возврат, за которым сразу следует перевод строки "\ r \ n" (U + 000D U + 000A). строка представляет собой последовательность из нуля или более символов, за которыми следует терминатор строки, или это последовательность из одного или нескольких символов с последующим концом строки. Строка не включает в себя строку терминатор.

С этим можно просто сделать:

Stream<String> stream = str.lines();

тогда, если вы хотите массив:

String[] array = str.lines().toArray(String[]::new);

Учитывая, что этот метод возвращает Stream, он открывает множество вариантов для вас, поскольку он позволяет написать сжатый и декларативное выражение возможных параллельных операций.

5 голосов
/ 19 мая 2017

Все ответы, данные здесь, на самом деле не соответствуют определению Javas новых строк, как, например, в BufferedReader # Readline. Java принимает \n, \r и \r\n в качестве новой строки. Некоторые ответы соответствуют нескольким пустым строкам или искаженным файлам. Например. <sometext>\n\r\n<someothertext> при использовании [\r\n]+ приведет к двум строкам.

String lines[] = string.split("(\r\n|\r|\n)", -1);

Напротив, ответ выше имеет следующие свойства:

  • соответствует Javas-определению новой строки, например, например BufferedReader использует его
  • не соответствует нескольким новым строкам
  • не удаляет завершающие пустые строки
4 голосов
/ 27 июня 2016

Для сохранения пустых строк от раздавливания используйте:

String lines[] = String.split("\\r?\\n", -1);
...