【Java】文字列から改行を除去・置換する方法完全ガイド|replaceAll・replace・strip・StringBuilder・CRLF対応まで

Javaで文字列から改行コードを削除・置換したい場面はよくあります。たとえばCSVの読み込み時に改行が混入している、フォーム入力値を1行にまとめたい、ログ文字列を整形したいといったケースです。

この記事では、replaceAll による正規表現置換(CRLF/LF/CR をまとめて処理)から、replace・strip・StringBuilder による方法まで、状況に応じた実装を解説します。

この記事でわかること

  • 改行コード LF / CR / CRLF の違いとJavaでの扱い方
  • replaceAll + 正規表現で全改行コードを一括削除する方法
  • String.replace で特定の改行コードだけ削除する方法
  • 改行を「スペース」や「別の文字」に置換する方法
  • Java 11+ の strip 系メソッドとの違い
  • 大量データを扱う場合の StringBuilder 活用
スポンサーリンク

改行コードの種類と Java での表現

種類 エスケープシーケンス 16進数 主な OS
LF(ラインフィード) \n 0x0A Linux / macOS / Unix
CR(キャリッジリターン) \r 0x0D 旧 macOS
CRLF(CR+LF) \r\n 0x0D 0x0A Windows
Windows 環境からのファイル読み込みに注意
Windows で作成されたテキストファイルを読み込むと CRLF(\r\n)が含まれます。\n だけ削除しても \r が残ります。環境を問わず処理するには \r\n|\r|\n をまとめて処理する正規表現が安全です。

方法1:replaceAll で全改行コードを一括削除(推奨)

最もよく使われる方法です。正規表現 \r\n|\r|\n で LF / CR / CRLF をまとめて空文字に置換します。

// 全改行コードを削除(LF・CR・CRLF すべて対応)
String original = "Hello,\nWorld!\r\nThis is a test.\r";
String result = original.replaceAll("\\r\\n|\\r|\\n", "");
System.out.println(result);
// → Hello,World!This is a test.

正規表現の優先順位に注意してください。\r\n を先に書かないと、\n が先にマッチして \r だけ残ります。

正規表現では CRLF を先に書く
\r\n|\r|\n(CRLF を先に)は正しい。\n|\r|\r\n(LF を先に)だと CRLF の \r が残ります。または [\r\n]+ で連続した改行をまとめて1つとして処理できます。
// [\r\n]+ で連続改行をまとめて削除
String result2 = original.replaceAll("[\\r\\n]+", "");
// → Hello,World!This is a test.

方法2:改行をスペースに置換する

複数行のテキストを1行にまとめたいが、単語の区切りを保ちたい場合は、空文字ではなくスペースに置換します。

// 改行をスペースに置換
String multiLine = "First line\nSecond line\r\nThird line";
String singleLine = multiLine.replaceAll("\\r\\n|\\r|\\n", " ");
System.out.println(singleLine);
// → First line Second line Third line

// 連続する改行を1つのスペースにまとめる
String condensed = multiLine.replaceAll("[\\r\\n]+", " ");
// → First line Second line Third line

方法3:String.replace で特定の改行コードだけ削除

正規表現を使わず、特定の改行コードだけを削除したい場合は String.replace() を使います。replaceAll より高速です。

// LF だけ削除
String result = original.replace("\n", "");

// CR だけ削除
String result2 = original.replace("\r", "");

// CRLF と LF を両方削除(順序に注意)
String result3 = original.replace("\r\n", "").replace("\n", "").replace("\r", "");

// System.lineSeparator() を使う(実行環境の改行コードに対応)
String result4 = original.replace(System.lineSeparator(), "");
String.replace は文字列リテラルマッチ
replace("\r\n", "") は CRLF にだけマッチします。LF のみの \n は残ります。環境を問わず削除するなら replaceAll("\\r\\n|\\r|\\n", "") の方が安全です。

方法4:Java 11+ の lines() を使う

Java 11 以降では String.lines() で行ごとに分割して処理できます。改行を除去しながら各行を加工したい場合に便利です。

// Java 11+: lines() で行ごとに処理
String multiLine = "Hello,\nWorld!\r\nThis is a test.\n";

// 改行を除去して1行の文字列に連結
String result = multiLine.lines()
    .collect(java.util.stream.Collectors.joining());
System.out.println(result);
// → Hello,World!This is a test.

// 各行をトリムしてスペースで結合
String result2 = multiLine.lines()
    .map(String::strip)
    .filter(l -> !l.isEmpty())
    .collect(java.util.stream.Collectors.joining(" "));
// → Hello, World! This is a test.

方法5:大量データは StringBuilder を使う

大量の文字列に対して繰り返し replacereplaceAll を適用するのは非効率です。StringBuilder でループ処理するとパフォーマンスが向上します。

public static String removeNewlines(String input) {
    if (input == null) return null;
    StringBuilder sb = new StringBuilder(input.length());
    for (int i = 0; i < input.length(); i++) {
        char c = input.charAt(i);
        if (c == '\r') {
            // CRLF の場合は \n もスキップ
            if (i + 1 < input.length() && input.charAt(i + 1) == '\n') {
                i++;
            }
        } else if (c != '\n') {
            sb.append(c);
        }
    }
    return sb.toString();
}

// 使用例
String result = removeNewlines("Hello,\r\nWorld!\n");
// → Hello,World!

strip / trim との違い

strip()trim() は文字列の 前後の空白・改行を除去するメソッドです。文字列中間の改行は除去しません。

メソッド 動作 中間の改行 Unicode対応
trim() 前後の制御文字(コード 32 以下)を除去 除去しない ×
strip()(Java 11+) 前後のUnicode空白文字を除去 除去しない
replaceAll("[\r\n]+", "") 全ての改行コードを除去 除去する
String text = "\n  Hello World  \r\n";

// trim: 前後の制御文字を除去(中間は残る)
System.out.println(text.trim());           // → "Hello World"

// strip: 前後のUnicode空白を除去(Java 11+)
System.out.println(text.strip());          // → "Hello World"

// replaceAll: 前後も中間も除去
System.out.println(text.replaceAll("[\\r\\n]", ""));  // → "  Hello World  "

よくある質問

Q. replaceAll(“\n”, “”) と replaceAll(“\\n”, “”) はどちらが正しいですか?
A. replaceAll("\\n", "") が正しいです。replaceAll の第1引数は正規表現文字列として解釈されます。Javaの文字列リテラルではバックスラッシュを \\ と書く必要があり、正規表現の \n を表すにはJavaコードで "\\n" と書きます。"\n" はJava文字列として実際の改行文字(LF)になり、正規表現の \n(改行にマッチ)とは別物です。
Q. ファイルを BufferedReader で読み込むと改行が入ります。除去するには?
A. BufferedReader.readLine() は行末の改行を自動的に除去して返します。改行が残っている場合は Files.readAllBytes()new FileInputStream() で読んでいる可能性があります。または、readLine() で読んだ後に .replaceAll("\\r\\n|\\r|\\n", "") を適用してください。
Q. 改行だけでなく、タブや複数のスペースもまとめて除去したい。
A. 正規表現 [\\s]+ で空白文字(スペース・タブ・改行)をまとめて処理できます。text.replaceAll("[\\s]+", " ").strip() とすると、連続する空白・改行をすべて1つのスペースにまとめて前後を除去します。
Q. null が渡ってくる場合の安全な書き方は?
A. null に対して replaceAll を呼ぶと NullPointerException が発生します。String result = (input != null) ? input.replaceAll("\\r\\n|\\r|\\n", "") : null; のように null チェックを行うか、Apache Commons の StringUtils.deleteWhitespace() などのユーティリティを使うと安全です。
Q. replaceAll と replace の速度はどちらが速いですか?
A. String.replace(CharSequence, CharSequence) の方が高速です。replaceAll は内部で正規表現エンジンを使うため、シンプルな文字列置換では replace の方が効率的です。ただし CRLF/LF/CR をまとめて処理する場合は正規表現が必要なため replaceAll を使います。大量データには StringBuilder ループが最も高速です。

方法まとめ

Javaで改行除去する方法まとめ

  • 一番シンプル: replaceAll("\\r\\n|\\r|\\n", "")(CRLF/LF/CR すべて対応)
  • スペースに置換: replaceAll("[\\r\\n]+", " ")
  • 特定コードだけ: replace("\r\n", "").replace("\n", "").replace("\r", "")
  • Java 11+ でStream処理: lines().collect(joining())
  • 大量データ・高速処理: StringBuilder ループ
  • strip/trim は中間の改行を除去しないので注意

あわせて読みたい