Разделить строку Java по новой строке

Я пытаюсь разделить текст в JTextArea использование регулярного выражения для разделения строки на n однако, это не работает и я также судим rn|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");
}

17 ответов


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

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

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


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

String.split("[\r\n]+")

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

Linebreak matcher
\R любая последовательность linebreak Unicode эквивалентна \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

таким образом, мы можем использовать его для соответствия:

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


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

если вы не хотите удалять из результирующего массива конечные пустые строки "" использовать split(regex, limit) с отрицательным


String.split(System.getProperty("line.separator"));

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


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

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

String.split("[\r\n]+")

возможно, это сработает:

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

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

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

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

все ответы, приведенные здесь, фактически не уважают определение 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 использует его
  • он не соответствует нескольким новым строкам
  • он не удаляет конечные пустые строки

приведенный выше код фактически не делает ничего видимого - он просто calcualtes затем сбрасывает расчет. Это код, который вы использовали, или просто пример для этого вопроса?

попробуйте сделать textAreaDoc.insertString (int, String, AttributeSet) в конце?


новый метод lines была представлена String класс java-11, который возвращает 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

строка#lines ()


Если по какой-то причине вы не хотите использовать String.split (например, из-за регулярные выражения) и вы хотите использовать функциональное программирование на Java 8 или новее:

List<String> lines = new BufferedReader(new StringReader(string))
        .lines()
        .collect(Collectors.toList());

String lines[] =String.split( System.lineSeparator())


после неудачных попыток на основании данного решения. Я заменяю \n С каким-то особым словом, а затем разделить. Для меня следующие сделали трюк:

article = "Alice phoned\n bob.";
article = article.replace("\n", " NEWLINE ");
String sen [] = article.split(" NEWLINE ");

Я не могу воспроизвести пример, приведенный в вопросе. Но, думаю, эту логику можно применить.


в качестве альтернативы предыдущие ответы, гуава это Splitter API можно использовать, если к результирующим строкам применяются другие операции, такие как обрезка строк или фильтрация пустых строк :

import com.google.common.base.Splitter;

Iterable<String> split = Splitter.onPattern("\r?\n").trimResults().omitEmptyStrings().split(docStr);

обратите внимание, что в результате Iterable, а не массив.


  • попробуйте это надеюсь, это было полезно для вас

 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");

существует три разных соглашения (можно сказать, что это де-факто стандарты) для установки и отображения строки:

  • carriage return + line feed
  • line feed
  • carriage return

в некоторых текстовых редакторах можно обменять один на другой:

Notepad++

самое простое-нормализовать до line feedи затем разделить.

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

package in.javadomain;

public class JavaSplit {

    public static void main(String[] args) {
        String input = "chennai\nvellore\ncoimbatore\nbangalore\narcot";
        System.out.println("Before split:\n");
        System.out.println(input);

        String[] inputSplitNewLine = input.split("\n");
        System.out.println("\n After split:\n");
        for(int i=0; i<inputSplitNewLine.length; i++){
            System.out.println(inputSplitNewLine[i]);
        }
    }

}