Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как разбить текст на строки

Короткий ответ

Метод 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 в начале и в конце строки.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.