補足記事

エスケープシーケンスって何?

文字列の中に「"」を書きたい、途中で改行したい。そんなときに使うのがエスケープシーケンスです。普通に書くと困る理由から、バックスラッシュを使う書き方を見てみましょう。

エスケープシーケンス一覧

まず一覧を載せておきます。エスケープシーケンスは、文字列や文字の中で、特定の文字をバックスラッシュとそれに続く文字の組み合わせで表す書き方です。使う理由は、この後に説明します。

書き方表されるもの
\"ダブルクォーテーション(")
\'シングルクォーテーション(')
\\バックスラッシュ(\)
\n改行(LF)
\t水平タブ(TAB)
\bバックスペース(BS)
\r復帰(CR)
\f改ページ(FF)
\0NUL文字(文字コード0。nullとは別)
\1018進数で指定する文字。この例はA
\s半角スペース(Java 15以降)

バックスペースや復帰、改ページなどは制御文字です。出力したときの表示やカーソルの動きは、端末などの環境に依存します。例えば、\bを出力すれば必ず前の文字が消える、というわけではありません。

8進数のエスケープは0〜7の数字で書きます。1〜2桁、または先頭が0〜3なら3桁で、\0もその一つです。また、テキストブロックにはバックスラッシュに続けてソース上の改行を書く行継続もありますが、ここでは通常の文字列リテラルを中心に説明します。

エスケープシーケンスを使わなければならない理由

Javaでは、通常の文字列はダブルクォーテーション「"」で囲うというルールがあります。以下のコード例は、それぞれEscapeExample.javaのmainメソッド内に書く部分です。

EscapeExample.java

System.out.print("あ");
実行結果
あ

これで「あ」という文字列が出力されます。このルールに従って、もし「"」自体を文字として出力しようとすると、

EscapeExample.java

System.out.print(""");

こんな風にダブルクォーテーションが三つ続いてしまいます。これはコンパイルエラーです。文字列の区切りとして使う「"」と、文字列に含めたい「"」とを、この書き方では正しく区別できません。

では、文字としての「"」を出力するにはどうしたらいいのか? こう書きます。

EscapeExample.java

System.out.print("\"");
実行結果
"

「"」の前に「\」を付けて\"と書くことで、文字列を閉じる記号ではなく、文字列の中の一文字としての「"」を表せます。

このように、区切りと紛らわしい文字や、直接は書きにくい改行などを表すのがエスケープシーケンスです。

エスケープシーケンスを表す記号「\」

じゃあもし、バックスラッシュ自体を出力したかったらどうするのでしょう?

EscapeExample.java

System.out.print("\");

これもコンパイルエラーになります。文字列を閉じたつもりの「"」が、直前のバックスラッシュによって\"として扱われるため、文字列を正しく閉じられていません。

つまり、バックスラッシュそのものも、エスケープシーケンスで表す必要があります。「\」一つを表すには「\\」と二つ書きます。

EscapeExample.java

System.out.print("\\");
実行結果
\

例えば、バックスラッシュの後ろに100という数字を続けて出力するなら、次のように書きます。

EscapeExample.java

System.out.print("\\100");
実行結果
\100

"\100"と一つだけで書くと、8進数のエスケープになり、この例では「@」を表してしまいます。バックスラッシュをそのまま表示したいときは二つ、です。

EscapeExample.java

System.out.print("¥100");
実行結果
¥100

では、バックスラッシュとダブルクォーテーションを続けた\"という二文字を出力するには? それぞれのエスケープをつなげます。

EscapeExample.java

System.out.print("\\\"");
実行結果
\"

文字列の中身を\\と\"に分けて考えると、前半がバックスラッシュ一つ、後半がダブルクォーテーション一つです。見慣れないうちは、一つずつ区切って読むと分かりやすいと思います。

覚えておくべきエスケープシーケンス

一覧にはいろいろありますが、まずは元記事でも挙げていた次の五つを押さえておきましょう。

書き方表されるもの
\"ダブルクォーテーション(")
\'シングルクォーテーション(')
\\バックスラッシュ(\)
\n改行(LF)
\t水平タブ(TAB)

シングルクォーテーションを表す\'は、特にchar型の文字リテラルで使います。Stringのダブルクォーテーションの中なら、シングルクォーテーションをそのまま書いても構いません。

EscapeExample.java

char quote = '\'';
System.out.print(quote);
実行結果
'

途中で改行したい場合は\nです。printはそれ自体では末尾に改行を追加しませんが、文字列に改行を含めれば、その位置で行が変わります。

EscapeExample.java

System.out.print("こんにちは\nさようなら");
実行結果
こんにちは
さようなら

タブを入れるには\tと書きます。

EscapeExample.java

System.out.print("名前\t点数");
実行結果
名前	点数

タブで空く幅は表示環境や現在位置によって変わります。一定個数のスペースを入れる記号ではありません。

改行せずに、バックスラッシュとnの二文字をそのまま出したいなら、ここでもバックスラッシュを二つにします。

EscapeExample.java

System.out.print("\\n");
実行結果
\n

まずは「特別な文字を、バックスラッシュから始まる組み合わせで表す」「バックスラッシュ自体には二つ必要」と覚えておけば、よく使う場面に対応できます。

正規表現のエスケープでは、Javaの文字列と正規表現の両方のルールを考える必要があります。そちらでバックスラッシュが二つ出てくる理由も、今回の仕組みとつながっています。

全講座の目次へ戻る

質問・コメント

0件

この記事についての質問や、学習して気づいたことをお寄せください。

コメントを書く

コメントの受付は準備中です。入力しても送信・保存されません。

コメントと一緒に公開される名前です。
3,000文字以内。パスワードなどの個人情報は書き込まないでください。

コメントは管理者の承認後に公開されます。

この記事のコメント

まだコメントはありません。