Перейти к основному содержимому

Разделить строку Java по новой строке

· 4 мин. чтения

1. Обзор

В этом руководстве мы рассмотрим различные способы разделения строки Java по символам новой строки. Поскольку символ новой строки различается в разных операционных системах, мы рассмотрим этот метод для Unix, Linux, Mac OS 9 и более ранних версий, macOS и ОС Windows.

2. Разделить строку по новой строке

2.1. Разделить строку по новой строке с помощью метода System#lineSeparator

Учитывая, что символ новой строки различается в разных операционных системах, мы можем использовать системные константы или методы, когда хотим, чтобы наш код не зависел от платформы.

Метод System#lineSeparator возвращает строку разделителя строк для базовой операционной системы. Он возвращает значение системного свойства line.separator .

Следовательно, мы можем использовать строку-разделитель строк, возвращаемую методом System#lineSeparator , вместе с методом String#split для разделения строки Java по символу новой строки:

String[] lines = "Line1\r\nLine2\r\nLine3".split(System.lineSeparator());

Результирующие строки будут такими:

["Line1", "Line2", "Line3"]

2.2. Разделить строку по новой строке с помощью регулярных выражений

Далее давайте начнем с рассмотрения различных символов, используемых для разделения строк в разных операционных системах.

Символ « \n » разделяет строки в Unix, Linux и macOS. С другой стороны, символ « \r\n » разделяет строки в среде Windows. Наконец, символ « \r » разделяет строки в Mac OS 9 и более ранних версиях.

Поэтому нам нужно позаботиться обо всех возможных символах новой строки при разбиении строки на новые строки с помощью регулярных выражений.

Наконец, давайте посмотрим на шаблон регулярного выражения, который охватывает все символы новой строки различных операционных систем. То есть нам нужно искать шаблоны «\n», «\r\n» и «\r». Это легко сделать с помощью регулярных выражений в Java .

Шаблон регулярного выражения, охватывающий все различные символы новой строки, будет таким:

"\\r?\\n|\\r"

Разобравшись, мы видим, что:

  • \\n = шаблон Unix, Linux и macOS
  • \\r\\n = шаблон среды Windows
  • \\r = шаблон MacOS 9 и более ранних версий

Далее воспользуемся методом split String # для разделения строки Java . Давайте рассмотрим несколько примеров:

String[] lines = "Line1\nLine2\nLine3".split("\\r?\\n|\\r");
String[] lines = "Line1\rLine2\rLine3".split("\\r?\\n|\\r");
String[] lines = "Line1\r\nLine2\r\nLine3".split("\\r?\\n|\\r");

Результирующие строки для всех примеров будут такими:

["Line1", "Line2", "Line3"]

2.3. Разделить строку по новой строке в Java 8

Java 8 предоставляет шаблон «\R» , который соответствует любой последовательности разрыва строки Unicode и охватывает все символы новой строки для разных операционных систем. Поэтому мы можем использовать шаблон «\R» вместо «\\r?\\n|\\r» в Java 8 или выше.

Давайте рассмотрим несколько примеров:

String[] lines = "Line1\nLine2\nLine3".split("\\R");
String[] lines = "Line1\rLine2\rLine3".split("\\R");
String[] lines = "Line1\r\nLine2\r\nLine3".split("\\R");

Опять же, результирующие выходные строки для всех примеров будут такими:

["Line1", "Line2", "Line3"]

2.4. Разделить строку по новой строке с использованием класса шаблона

В Java 8 класс Pattern поставляется с удобным методом splitAsStream .

В нашем случае мы можем использовать шаблон «\R» , но, конечно, этот метод также может быть использован для разделения строки любым, более сложным регулярным выражением .

Давайте посмотрим на это в действии:

Pattern pattern = Pattern.compile("\\R");
Stream<String> lines = pattern.splitAsStream("Line1\nLine2\nLine3");
Stream<String> lines = pattern.splitAsStream("Line1\rLine2\rLine3");
Stream<String> lines = pattern.splitAsStream("Line1\r\nLine2\r\nLine3");

Как мы видим, на этот раз вместо массива мы получаем Stream of String , который мы можем легко обрабатывать дальше.

2.5. Разделить строку по новой строке в Java 11

Java 11 делает разделение по новой строке очень простым:

Stream<String> lines = "Line1\nLine2\rLine3\r\nLine4".lines();

Поскольку lines() использует шаблон «\R» под капотом, он работает со всеми видами разделителей строк.

Как мы видим, сложно найти более простой способ разбить строку по символу новой строки!

3. Заключение

В этой быстрой статье мы рассмотрели различные символы новой строки, с которыми мы, вероятно, столкнемся в разных операционных системах. Кроме того, мы увидели, как разделить строку Java на символы новой строки, используя наш собственный шаблон регулярного выражения, а также шаблон «\R» , доступный, начиная с Java 8.

Как всегда, все эти примеры кода доступны на GitHub .