Разделить строку 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 любая последовательность linebreak Unicode эквивалентна\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");
для сохранения пустых строк от получения squashed используйте:
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 использует его
- он не соответствует нескольким новым строкам
- он не удаляет конечные пустые строки
приведенный выше код фактически не делает ничего видимого - он просто calcualtes затем сбрасывает расчет. Это код, который вы использовали, или просто пример для этого вопроса?
попробуйте сделать textAreaDoc.insertString (int, String, AttributeSet) в конце?
новый метод 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
Если по какой-то причине вы не хотите использовать 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 ");
Я не могу воспроизвести пример, приведенный в вопросе. Но, думаю, эту логику можно применить.
в качестве альтернативы предыдущие ответы, гуава это 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");
существует три разных соглашения (можно сказать, что это де-факто стандарты) для установки и отображения строки:
-
carriage return
+line feed
line feed
carriage 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]);
}
}
}