Я пытаюсь разделить текст с 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");
}
Ответы:
Это должно охватывать вас:
На самом деле вам нужно беспокоиться только о двух новых строках (UNIX и Windows).
источник
split
по умолчанию удаляет завершающие пустые строки, если они имеют результат разделения. Чтобы отключить этот механизм, вам нужно использовать перегруженную версиюsplit(regex, limit)
с отрицательным пределом вродеtext.split("\\r?\\n", -1)
. Дополнительная информация: Java String splitString#split(String regex)
Метод использует регулярные выражения (регулярные выражения). Поскольку Java 8 поддерживает регулярные выражения,\R
которые представляют (из документации класса Pattern ):Таким образом, мы можем использовать его для соответствия:
\u000D\000A
->\r\n
пара\n
)\t
который\u0009
)\f
)\r
)Как вы видите,
\r\n
он помещается в начало регулярного выражения, что гарантирует, что регулярное выражение будет сначала пытаться сопоставить эту пару , и только в случае неудачного совпадения оно попытается сопоставить разделители строк из одного символа .Так что, если вы хотите разделить на разделители, используйте
split("\\R")
.Если вы не хотите удалять из результирующего массива завершающие пустые строки,
""
используйтеsplit(regex, limit)
с отрицательнымlimit
параметром вродеsplit("\\R", -1)
.Если вы хотите обработать одну или несколько непрерывных пустых строк как использование одного разделителя
split("\\R+")
.источник
\\R+
, чтобы избежать любых символов конца строки, которые не были покрыты\\R
одним.Если вы не хотите пустых строк:
источник
Это должно быть системно-независимым
источник
Новый метод
lines
был введен вString
класс вJava-11, который возвращаетStream<String>
Вот несколько примеров:
Строка # строки ()
источник
Вам не нужно удваивать escape-символы в группах символов.
Для всех непустых строк используйте:
источник
\r
и\n
могут иметь один или два обратных слэша; они работают в любом случае.'\\'
в коде становится'\'
символом и затем передается в механизм RegEx, поэтому"[\\r\\n]"
код становится[\r\n]
в памяти, и RegEx будет обрабатывать это. Я не знаю, как именно Java обрабатывает RegEx, но хорошей практикой является передача «чистого» строкового шаблона ASCII в движок RegEx и его обработка, а не передача двоичных символов."[\r\n]"
становится (шестнадцатеричным)0D0A
в памяти, и один механизм RegEx может принять его, в то время как другой задохнется. Таким образом, суть в том, что даже если Java-В
JDK11
вString
классе естьlines()
метод:Далее документация продолжает:
С этим можно просто сделать:
тогда, если вы хотите массив:
Учитывая, что этот метод возвращает Stream, он открывает множество вариантов для вас, поскольку он позволяет написать краткое и декларативное выражение возможных параллельных операций.
источник
Может быть, это будет работать:
Удалите двойную обратную косую черту из параметра метода split:
источник
Все ответы, приведенные здесь, на самом деле не соответствуют определению Javas новых строк, как, например, в BufferedReader # readline. Java принимает
\n
,\r
и в\r\n
качестве новой строки. Некоторые ответы соответствуют нескольким пустым строкам или искаженным файлам. Например.<sometext>\n\r\n<someothertext>
при использовании[\r\n]+
приведет к двум строкам.Напротив, ответ выше имеет следующие свойства:
источник
Если по какой-то причине вы не хотите использовать
String.split
(например, из-за регулярных выражений ) и хотите использовать функциональное программирование на Java 8 или новее:источник
String[] lines = new BufferedReader(...).lines().toArray(String[]::new);
для массива вместо списка. Хорошая особенность этого решения в том, что онBufferedReader
знает обо всех подобных терминаторах, поэтому он может обрабатывать текст во всех видах форматов. (Большинство решений на основе регулярных выражений, размещенных здесь, в этом отношении не дотягивают.)Для сохранения пустых строк от сдавливания используйте:
источник
Приведенный выше код на самом деле не делает ничего видимого - он просто вычисляет, а затем выводит вычисления. Это код, который вы использовали, или просто пример для этого вопроса?
попробуйте сделать textAreaDoc.insertString (int, String, AttributeSet) в конце?
источник
В качестве альтернативы предыдущим ответам,
Splitter
API-интерфейс guava можно использовать, если к результирующим строкам должны применяться другие операции, такие как обрезка или фильтрация пустых строк:Обратите внимание, что результатом является
Iterable
массив, а не массив.источник
String lines[] =String.split( System.lineSeparator())
источник
После неудачных попыток на основе всех приведенных решений. Я заменяю
\n
специальным словом, а затем разделяю. Для меня следующие сделали свое дело:Я не мог повторить пример, приведенный в вопросе. Но, я думаю, эта логика может быть применена.
источник
Ответы выше не помогли мне на Android, благодаря ответу Pshemo, который работал для меня на Android. Я оставлю некоторые ответы Пшемо здесь:
источник
источник
Существует три различных соглашения (можно сказать, что это стандарты де-факто ) для установки и отображения переноса строки:
carriage return
+line feed
line feed
carriage return
В некоторых текстовых редакторах можно заменить один на другой:
Самое простое - нормализовать,
line feed
а затем разделить.источник
В городе появился новый мальчик, поэтому вам не нужно разбираться со всеми вышеперечисленными сложностями. Начиная с JDK 11 , просто нужно писать как одну строку кода, он разделит строки и вернет вам Stream of String.
Некоторые ссылки. https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#lines () https://www.azul.com/90-new -Особенности-и-АПИС-в-JDK-11 /
Я надеюсь, что это будет полезно для кого-то. Удачного кодирования.
источник
источник