Ответ 1
Это должно охватывать вас:
String lines[] = string.split("\\r?\\n");
Есть только две новые строки (UNIX и Windows), о которых вам нужно беспокоиться.
Я пытаюсь разделить текст в 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");
}
Это должно охватывать вас:
String lines[] = string.split("\\r?\\n");
Есть только две новые строки (UNIX и Windows), о которых вам нужно беспокоиться.
Если вы не хотите пустые строки:
String.split("[\\r\\n]+")
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]
Таким образом, мы можем использовать его для соответствия:
\u000D\000A
→ \r\n
пара \n
)\t
, которая \u0009
)\f
)\r
)Как вы видите, \r\n
помещается в начало регулярного выражения, что гарантирует, что регулярное выражение будет сначала пытаться сопоставить эту пару, и только в случае неудачного совпадения оно попытается сопоставить разделители строк из одного символа.
Поэтому, если вы хотите разделить на разделители строк, используйте split("\\R")
.
Если вы не хотите удалять из результирующего массива завершающие пустые строки ""
, используйте split(regex, limit)
с отрицательным параметром limit
, например split("\\R", -1)
.
Если вы хотите обработать одну или несколько непрерывных пустых строк как один разделитель, используйте split("\\R+")
.
String.split(System.getProperty("line.separator"));
Это должно быть независимым от системы
Вам не нужно удваивать символы escape в символьных группах.
Для всех непустых строк используйте:
String.split("[\r\n]+")
Новые 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
Возможно, это сработает:
Удалите двойные обратные косые черты из параметра метода split:
split = docStr.split("\n");
Все приведенные здесь ответы фактически не соответствуют определению Javas новых строк, как указано в BufferedReader # Readline. Java принимает \n
, \r
и \r\n
как новую строку. Некоторые ответы соответствуют нескольким пустым строкам или искаженным файлам. Например. <sometext>\n\r\n<someothertext>
при использовании [\r\n]+
приведет к двум строкам.
String lines[] = string.split("(\r\n|\r|\n)", -1);
Напротив, ответ выше имеет следующие свойства:
В 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, он открывает множество вариантов для вас, поскольку он позволяет написать краткое и декларативное выражение возможных параллельных операций.
Для сохранения пустых строк от раздавливания используйте:
String lines[] = String.split("\\r?\\n", -1);
Если по какой-то причине вы не хотите использовать String.split
(например, из-за регулярных выражений) и хотите использовать функциональное программирование на Java 8 или новее:
List<String> lines = new BufferedReader(new StringReader(string))
.lines()
.collect(Collectors.toList());
Вышеприведенный код фактически ничего не делает - он просто вычисляет, а затем выдает расчет. Это код, который вы использовали, или просто пример для этого вопроса?
попробуйте сделать textAreaDoc.insertString(int, String, AttributeSet) в конце?
String lines[] =String.split( System.lineSeparator())
После неудачных попыток на основе всех данных решений. Я заменяю \n
некоторым специальным словом, а затем разделяю. Для меня следующий трюк:
article = "Alice phoned\n bob.";
article = article.replace("\\n", " NEWLINE ");
String sen [] = article.split(" NEWLINE ");
Я не смог воспроизвести пример, приведенный в вопросе. Но, я думаю, эта логика может быть применена.
В качестве альтернативы предыдущим ответам API guava Splitter
может использоваться, если к результирующим строкам будут применяться другие операции, такие как обрезка линий или фильтрация пустых строк:
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
В некоторых текстовых редакторах можно обменять один на другой:
Самое простое - нормализовать line feed
и затем расколоть.
final String[] lines = contents.replace("\r\n", "\n")
.replace("\r", "\n")
.split("\n", -1);
В городе есть новый мальчик, поэтому вам не нужно заниматься всеми вышеперечисленными сложностями. Начиная с 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/
Надеюсь, это кому-то поможет. Счастливое кодирование.
Ответы выше не помогли мне на Android, благодаря ответу Pshemo, который работал для меня на Android. Я оставлю некоторые ответы Пшемо здесь:
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]);
}
}
}