Разделить строку Java на новую строку
Я пытаюсь разделить текст в JTextArea используя регулярное выражение для разбиения строки n однако, это не работает и я также судим rn|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");
}
17 ответов:
Это должно охватывать вас:
String lines[] = string.split("\r?\n");на самом деле есть только две новые строки (UNIX и Windows), о которых вам нужно беспокоиться.
splitметод использует регулярное выражение (регулярные выражения). Так как Java 8 regex поддерживает\R, который представляет собой (с документация класса Pattern):Linebreak matcher
\R в любой последовательности разрыв строки в Юникоде, эквивалентно\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]Итак, мы можем использовать его, чтобы соответствовать:
\u000D0A->\r\nпара- u000A\ -> линия подачи (
\n)- u000B\ -> таблица строк (не путайте с символ табуляции
\tчто это\u0009)- \u000C -> форма корма (
\f)- \u000D -> возврат каретки (
\r)- \u0085 - > следующая строка (NEL)
- u2028\ -> разделитель строки
- \u2029 -> пункта сепаратор
Как видите,
\r\nпомещается в начало регулярного выражения, которое гарантирует, что регулярное выражение попытается сначала соответствовать этому пара, и только если это не удается, он будет пытаться соответствовать один символ разделители строк.
так что если вы хотите разделить на разделительную линию, используйте
split("\R").если вы не хочу удалять из результирующего массива конечные пустые строки
""использоватьsplit(regex, limit)с отрицательным
вам не нужно удваивать escape-символы в группах символов.
для всех непустых строк используйте:
String.split("[\r\n]+")
может быть, это будет работать:
удалите двойные обратные косые черты из параметра метода split:
split = docStr.split("\n");
для сохранения пустых строк от раздавливания используйте:
String lines[] = String.split("\r?\n", -1);
все ответы, приведенные здесь, на самом деле не уважают определение 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 использует его
- он не соответствует нескольким новым строкам
- он не удаляет конечные пустые строки
приведенный выше код на самом деле не делает ничего видимого - он просто вычисляет, а затем сбрасывает расчет. Это код, который вы использовали, или просто пример для этого вопроса?
попробуйте сделать textAreaDoc.insertString (int, String, AttributeSet) в конце?
новый метод
linesбыла представленаStringкласс java-11, который возвращаетStream<String>возвращает поток подстрок, извлеченных из этой строки секционированных по линии терминатора.
признанные Терминаторы линии - это линия подачи" \n " (U+000A), каретка возврат "\r " (U+000D) и возврат каретки, за которым немедленно следует a линия подачи "\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
Если по какой-то причине вы не хотите использовать
String.split(например, из-за регулярные выражения) и вы хотите использовать функциональное программирование на Java 8 или новее:List<String> lines = new BufferedReader(new StringReader(string)) .lines() .collect(Collectors.toList());
после неудачных попыток на основании данного решения. Я заменяю
\nС каким-то особым словом, а затем разделить. Для меня следующий трюк сделал:article = "Alice phoned\n bob."; article = article.replace("\n", " NEWLINE "); String sen [] = article.split(" NEWLINE ");Я не мог повторить пример, приведенный в вопросе. Но, я думаю, эта логика может быть применена.
в качестве альтернативы предыдущим ответам, гуава
SplitterAPI можно использовать, если к полученным строкам применяются другие операции, такие как обрезка строк или фильтрация пустых строк :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 feedline feedcarriage returnв некоторых текстовых редакторах можно обменять один на другой:
самое простое-нормализовать до
line feedи затем разделить.final String[] lines = contents.replace("\r\n", "\n") .replace("\r", "\n") .split("\n", -1);
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]); } } }

Comments