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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

String#split​(String regex) метод использует регулярные выражения (регулярные выражения). Поскольку 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+").

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

В 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, он открывает множество вариантов для вас, поскольку он позволяет написать краткое и декларативное выражение возможных параллельных операций.

Ответ 10

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

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

Ответ 11

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

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

Ответ 12

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

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

Ответ 13

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

Ответ 14

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

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

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

Ответ 15

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

import com.google.common.base.Splitter;

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

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

Ответ 16

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

 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

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

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

Ответ 18

В городе есть новый мальчик, поэтому вам не нужно заниматься всеми вышеперечисленными сложностями. Начиная с JDK 11, нужно просто написать как одну строку кода, она разделит строки и вернет вам Stream of String.

public class MyClass {
public static void main(String args[]) {
   Stream<String> lines="foo \n bar \n baz".lines();
   //Do whatever you want to do with lines
}}

Некоторые ссылки. https://docs.oracle.com/ru/java/javase/11/docs/api/java.base/java/lang/String.html#lines() https://www.azul.com/90-new -Особенности-и-АПИС-в-JDK-11/

Надеюсь, это кому-то поможет. Счастливое кодирование.

Ответ 19

Ответы выше не помогли мне на Android, благодаря ответу Pshemo, который работал для меня на Android. Я оставлю некоторые ответы Пшемо здесь:

split("\\\\n")

Ответ 20

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]);
        }
    }

}