Разделенная строка Java новой строкой

Я пытаюсь разбить текст на 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");
}

22 ответа

Решение

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

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

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

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

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

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

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


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

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

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

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

String.split("[\\r\\n]+")
String.split(System.getProperty("line.separator"));

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

Новый метод 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

split("\\\\n")

К сожалению, в Java отсутствует простой и эффективный метод разделения строки на фиксированную строку. Оба и потоковый API сложны и относительно медленны. Кроме того, они могут давать разные результаты.

String::split проверяет ввод, затем компилируется в java.util.regex.Pattern каждый раз (кроме случаев, когда ввод содержит только один безопасный символ).

Тем не мение, Patternочень быстро после компиляции . Итак, лучшее решение - предварительно скомпилировать шаблон:

      private static final Pattern LINE_SEP_PATTERN = Pattern.compile("\\R");

Тогда используйте это так:

      String[] lines = LINE_SEP_PATTERN.split(input);

Начиная с Java 8, \Rсоответствует любому разрыву строки, указанному в Unicode. До Java 8 вы могли использовать что-то вроде этого:

      Pattern.compile(Pattern.quote(System.lineSeparator()))

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

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

В городе есть новый мальчик, поэтому вам не нужно разбираться со всеми вышеперечисленными сложностями.Начиная с 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/en/java/javase/11/docs/api/java.base/java/lang/String.html https://www.azul.com/90-new-features-and-apis-in-jdk-11/

Я надеюсь, что это будет полезно для кого-то. Удачного кодирования.

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

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

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");
      String str = "First\nSecond\nThird", strArray[];
if (str.contains("\\n")) { // contains newline character
    strArray = str.split("\\\\n");
}
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]);
        }
    }

}
Другие вопросы по тегам