Как разбить текст на строки
Короткий ответ
Метод lines() возвращает поток строк и понимает переводы строк всех систем — \n, \r\n и \r:
void main() {
String text = "first\r\nsecond\nthird";
List<String> lines = text.lines().toList();
IO.println(lines);
IO.println(lines.size());
}Результат:
[first, second, third]
3Пронумеровать строки
Получив список, можно пройти по нему с индексом:
void main() {
var lines = "apple\nbanana\ncherry".lines().toList();
for (int i = 0; i < lines.size(); i++) {
IO.println((i + 1) + ": " + lines.get(i));
}
}Результат:
1: apple
2: banana
3: cherryБез пустых строк
В потоке легко отбросить пустые строки и лишние пробелы:
void main() {
String text = """
milk
bread
eggs
""";
var items = text.lines().map(String::strip).filter(line -> !line.isEmpty()).toList();
IO.println(items);
}Результат:
[milk, bread, eggs]Через split
split("\\R") делает то же самое, но возвращает массив. \\R в регулярном выражении означает любой перевод строки:
void main() {
String[] lines = "a\r\nb\nc".split("\\R");
IO.println(lines.length);
}Результат:
3Частая ошибка
Разбивать по "\n". Текст из файлов Windows содержит \r\n, и в конце каждой строки остаётся невидимый \r:
void main() {
String[] lines = "yes\r\nno".split("\n");
IO.println(lines[0].equals("yes"));
IO.println(lines[0].length());
}Результат:
false
4Функции из этого ответа
- String.lines() — Разбивает строку на строки по переводам строки и возвращает их потоком.
- String.split() — Разбивает строку на массив частей по разделителю.
- String.strip() — Удаляет любые пробельные символы Unicode в начале и в конце строки.