Javaの文字列エスケープとテキストブロック

Javaの文字列エスケープガイド。文字エスケープシーケンス、Unicodeエスケープ、テキストブロック(Java 13+)、charリテラルとStringリテラルの違いを解説。StringEscapeUtilsの代替手段も含みます。

Language-Specific

詳細な説明

Javaの文字列エスケープ

Java文字列は常にダブルクォートで囲まれ、有効なエスケープシーケンスに関して厳格なルールが適用されます。一部の言語とは異なり、Javaは認識できないエスケープを暗黙的にパススルーしません — 無効なシーケンスはコンパイルエラーになります。

有効なエスケープシーケンス

\\"   → ダブルクォート
\\'   → シングルクォート(主にcharリテラル用)
\\\\   → バックスラッシュ
\\n   → 改行(LF)
\\r   → キャリッジリターン(CR)
\\t   → タブ
\\b   → バックスペース
\\f   → フォームフィード
\\uXXXX → Unicode文字(ちょうど16進4桁)
\\OOO  → 8進文字(1-3桁、最大 \\377)

Unicodeエスケープの特殊性

Javaは \\uXXXX をパース前のレキサーレベルで処理します。つまりUnicodeエスケープは文字列の外でも機能します。これは \\u000A(改行)が文字列リテラル内でコンパイルエラーを引き起こすことも意味します。レキサーがソースに実際の改行を挿入するためです。

テキストブロック(Java 13+)

テキストブロックはトリプルダブルクォートを使用し、複数行のフォーマットを保持します。テキストブロック内ではダブルクォートのエスケープは不要です(3つが連続して出現しない限り)。末尾の空白とインデントは自動的に適用される stripIndent() メソッドで管理されます。

charリテラルとStringリテラルの違い

charリテラルはシングルクォートを使用し、シングルクォートのエスケープが必要です:'\\''。Stringリテラルはダブルクォートを使用し、ダブルクォートのエスケープが必要です:"\\""。両者は同じバックスラッシュエスケープシーケンスを共有します。

よく使われるパターン

  • Javaの正規表現: 正規表現内のすべてのバックスラッシュを文字列で二重にする必要があります:"\\\\d+" で1桁以上の数字にマッチ。
  • ファイルパス: ダブルエスケープの代わりに java.nio.file.Path やフォワードスラッシュを使用。
  • プロパティファイル: キーと値の手動エスケープの代わりに Properties クラスを使用。

Apache Commons StringEscapeUtils

プログラム的なエスケープには、Apache Commons Textが StringEscapeUtils を提供し、escapeJava()escapeHtml4()escapeXml10() などのメソッドがあります。

ユースケース

Javaの文字列エスケープは、SQLクエリの構築(PreparedStatementを使用)、正規表現パターンの構築、XMLおよびJSONコンテンツの生成、クロスプラットフォームでのファイルパス処理、特殊文字を含むログメッセージの作成、古いコードベースでのUnicodeエスケープシーケンスによる国際化テキストの処理に不可欠です。

試してみる — String Escape/Unescape

フルツールを開く