Разделенная строка 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]
Таким образом, мы можем использовать его для соответствия:
\u000D\000A
->\r\n
пара- \ u000A -> перевод строки (
\n
) - \ u000B -> табуляция строк (НЕ путайте с табуляцией символов
\t
который\u0009
) - \ u000C -> подача формы (
\f
) - \ u000D -> возврат каретки (
\r
) - \ u0085 -> следующая строка (NEL)
- \ u2028 -> разделитель строк
- \ u2029 -> разделитель абзацев
Как вы видите \r\n
помещается в начале регулярного выражения, что гарантирует, что регулярное выражение будет сначала пытаться сопоставить эту пару, и только в случае неудачного сопоставления оно будет пытаться сопоставить разделители строк из одного символа.
Так что если вы хотите разделить на использование разделителя строк split("\\R")
,
Если вы не хотите удалять из результирующего массива завершающие пустые строки ""
использование split(regex, limit)
с отрицательным limit
параметр как split("\\R", -1)
,
Если вы хотите обработать одну или несколько непрерывных пустых строк как использование одного разделителя split("\\R+")
,
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
В некоторых текстовых редакторах можно заменить один на другой:
Самое простое - это нормализовать line feed
а затем разделить.
final String[] lines = contents.replace("\r\n", "\n")
.replace("\r", "\n")
.split("\n", -1);
После неудачных попыток на основе всех приведенных решений. Я заменяю \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]);
}
}
}