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(
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 を使う
大量の文字列に対して繰り返し replace や replaceAll を適用するのは非効率です。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 は中間の改行を除去しないので注意