文字列におけるバックスラッシュエスケープシーケンス

プログラミング文字列におけるバックスラッシュエスケープシーケンスの仕組みを解説します。エスケープ文字としてのバックスラッシュ、\n、\t、\\などの一般的なシーケンス、各言語でのリテラルバックスラッシュの処理方法を学びます。

Basic Escaping

詳細な説明

バックスラッシュエスケープシーケンス

バックスラッシュ(\\)は、ほとんどのプログラミング言語で共通のエスケープ文字です。文字列内の特定の文字の前に置くと、その文字の意味がリテラルから制御命令に変わります。

バックスラッシュエスケープの仕組み

文字列リテラルでは、コンパイラやインタプリタが文字を順番に読み取ります。バックスラッシュに遭遇すると、バックスラッシュ自体は出力しません。代わりに次の文字を読み、その2文字の組み合わせを1つの特殊文字または命令として解釈します。

\\n  → 改行(ラインフィード、U+000A)
\\t  → 水平タブ(U+0009)
\\\\  → リテラルバックスラッシュ
\\0  → null文字(U+0000)
\\'  → リテラルシングルクォート
\\"  → リテラルダブルクォート

バックスラッシュ自体の表現

バックスラッシュがエスケープの起点として機能するため、リテラルバックスラッシュを表すには別のバックスラッシュでエスケープする必要があります:\\\\。これはWindowsのファイルパスを扱う際に最も混乱を招く原因の一つです。

// 間違い — \\n は改行であり、パスの一部ではない
const path = "C:\\new_folder\\test";

// 正しい — 各 \\\\ が1つのリテラルバックスラッシュを生成
const path = "C:\\\\new_folder\\\\test";

言語による違い

C系言語(C、C++、Java、JavaScript、C#)のほとんどは同じコアセットのバックスラッシュエスケープを共有しています。Pythonはバックスラッシュをリテラルとして扱うraw文字列(r"...")を追加しています。Goではすべてのエスケープシーケンスが有効でなければならず、認識できない \\z はパススルーではなくコンパイルエラーになります。

正規表現でのエスケープ

正規表現はエスケープの第2層を追加します。リテラルバックスラッシュにマッチする正規表現は、通常の文字列では \\\\\\\\ が必要です。文字列層が1ペアを消費し、正規表現層がもう1ペアを消費するためです。

よくある落とし穴

  • Windowsのファイルパス: 各セパレータをダブルエスケープする代わりに、フォワードスラッシュやraw文字列を使用しましょう。
  • JSON文字列: バックスラッシュは常にエスケープ(\\\\)する必要があり、限られたシーケンスセット(\\n\\t\\"\\\\\\/\\b\\f\\r\\uXXXX)のみ有効です。
  • コピペエラー: 環境間でエスケープ済み文字列をコピーすると、エスケープ層が追加されたり除去されたりすることがあります。

ユースケース

バックスラッシュエスケープの理解はすべての開発者にとって不可欠です。ファイルパスの記述、正規表現パターンの構築、JSONペイロードの作成、SQLクエリの生成、シェルコマンドの作成、そして文字列デリミタ構文と競合する直接入力できない文字を表現する必要があるあらゆる場面で使用されます。

試してみる — String Escape/Unescape

フルツールを開く