1. 概要

このチュートリアルでは、Java文字列を改行文字で分割するさまざまな方法を見ていきます。 改行文字はオペレーティングシステムによって異なるため、Unix、Linux、Mac OS 9以前、macOS、およびWindowsOSを対象とする方法を見ていきます。

2. Stringを改行で分割

2.1. System#lineSeparator メソッドを使用して、改行によってStringを分割します

改行文字はさまざまなオペレーティングシステムで異なるため、コードをプラットフォームに依存させたくない場合は、システム定義の定数またはメソッドを使用できます。

System#lineSeparator メソッドは、基盤となるオペレーティングシステムの行区切り文字列を返します。 システムプロパティline.separatorの値を返します。

したがって、 System#lineSeparatorメソッドによって返される行区切り文字列をString#split メソッドとともに使用して、Java Stringを改行で分割できます。

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

結果の行は次のようになります。

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

2.2. 正規表現を使用して改行でStringを分割する

次に、さまざまなオペレーティングシステムで行を区切るために使用されるさまざまな文字を確認することから始めましょう。

\n 」文字は、Unix、Linux、およびmacOSの行を区切ります。 一方、「 \ r \ n 」文字は、Windows環境では行を区切ります。 最後に、「 \ r 」文字は、MacOS9以前の行を区切ります。

したがって、正規表現を使用して文字列を改行で分割するときに、可能なすべての改行文字を処理する必要があります。

最後に、さまざまなオペレーティングシステムの改行文字をすべてカバーする正規表現パターンを見てみましょう。 つまり、「\ n」、「\ r \ n」、「\r」のパターンを探す必要があります。 これは、Java正規表現を使用して簡単に実行できます。

すべての異なる改行文字をカバーする正規表現パターンは次のようになります。

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

分解すると、次のことがわかります。

  • \\ n = Unix、Linux、macOSパターン
  • \\ r \\ n =Windows環境パターン
  • \\ r =MacOS9以前のパターン

次に、 String split メソッドを使用して、Java Stringを分割します。 いくつかの例を見てみましょう。

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. 文字列をJava8の改行で分割

Java 8は、任意のUnicode改行シーケンスに一致し、さまざまなオペレーティングシステムのすべての改行文字をカバーする“ \ R”パターンを提供します。 したがって、Java 8以降では、“ \\ r?\\ n | \\ r” の代わりに“ \ R”パターンを使用できます。

いくつかの例を見てみましょう。

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. Patternクラスを使用して改行によってStringを分割します

Java 8では、Patternクラスに便利なsplitAsStreamメソッドが付属しています。

この場合、“ \ R” パターンを利用できますが、もちろん、このメソッドを使用して、Stringをより洗練された正規表現で分割することもできます。

実際の動作を見てみましょう。

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");

ご覧のとおり、今回は、配列の代わりに、さらに簡単に処理できるStringStreamを取得します。

2.5. 文字列をJava11の改行で分割

Java 11を使用すると、改行による分割が非常に簡単になります。

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

lines()は、内部で“ \ R” パターンを使用するため、あらゆる種類の行区切り記号で機能します。

ご覧のとおり、Stringを改行で分割する簡単な方法を見つけるのは難しいでしょう。

3. 結論

この簡単な記事では、さまざまなオペレーティングシステムで遭遇する可能性のあるさまざまな改行文字について説明しました。 さらに、独自の正規表現パターンを使用し、Java 8以降で使用可能な“ \ R” パターンを使用して、Java文字列を改行で分割する方法を確認しました。

いつものように、これらのコードサンプルはすべてGitHub利用できます。