プログラミングでは「”(ダブルクォーテーション)」のように特殊な意味を持つ記号を入力する際、エスケープ処理が様々な場面で必要となります。
本記事では、Javaでのプログラミングにおける特殊文字のエスケープ処理について、サンプルコードを掲載しながらご紹介していきます。
目次
Javaでのエスケープ処理とは
Javaでは文字列を表す「””(ダブルクォーテーションマーク)」のように、特殊な記号といったものが存在します。
特殊な記号をそのまま文字として出力したい場合や改行・タブといった特殊文字を文字列のなかで利用したい場合にはエスケープ処理が必要となります。
エスケープシーケンス
エスケープ処理は、エスケープシーケンスと呼ばれる「\(バックスラッシュ)」と何らかの記号や文字で表現します。
バックスラッシュの後ろに特定の記号や文字がセットになることで、特殊文字と認識されエスケープ処理が実行されます。
エスケープシーケンスの定番
頻繁に利用されるエスケープシーケンスをいくつか確認しておきましょう。
-
- \n : 改行
- \t : タブ
- \’ : シングルクォーテーション
- \” : ダブルクォーテーション
- \\ : バックスラッシュ
- \xxx : 8進数の文字コード
- \uxxx : 16進数の文字コード
エスケープ処理をJavaのサンプルで確認しよう
ここまでで概要について解説してきましたので、実際に定番のエスケープシーケンスを使ってどのような処理が実行されるのか具体的に確認しておきましょう。
サンプル
public class Main { public static void main(String[] args) { System.out.println("改行の\nエスケープシーケンスです。"); System.out.println("エスケープシーケンスではないためn改行されません。"); System.out.println("タブの\tエスケープシーケンスです。"); System.out.println("エスケープシーケンスではないためtタブが挿入されません。"); System.out.println('\''); //シングルクォーテーションが表示されます。 // System.out.println('''); この記述はエラーとなります。 System.out.println("ダブルクォーテーションの\"エスケープシーケンスです。"); // System.out.println("""); 文字列を意味するダブルクォーテーションとして認識されるため数が合わずエラーとなります。 System.out.println("バックスラッシュの\\エスケープシーケンスです。"); // System.out.println("\バックスラッシュ"); 無効なエスケープシーケンスとして認識されるためエラーとなります。 System.out.println("エスケープシーケンス \061 \062 \063 \064 \065"); System.out.println("エスケープシーケンスなし 061 062 063 064 065"); System.out.println("エスケープシーケンス \u0031 \u0032 \u0033 \u0034 \u0035"); System.out.println("エスケープシーケンスなし u0031 u0032 u0033 u0034 u0035"); } }
実行結果
改行の エスケープシーケンスです。 エスケープシーケンスではないためn改行されません。 タブの エスケープシーケンスです。 エスケープシーケンスではないためtタブが挿入されません。 ' ダブルクォーテーションの"エスケープシーケンスです。 バックスラッシュの\エスケープシーケンスです。 エスケープシーケンス 1 2 3 4 5 エスケープシーケンスなし 061 062 063 064 065 エスケープシーケンス 1 2 3 4 5 エスケープシーケンスなし u0031 u0032 u0033 u0034 u0035
サンプルのようにエスケープシーケンスで記述すると、改行やタブといった特殊文字に変換されたり、ダブルクォーテーションのようにJavaでは文字列と認識される記号をそのまま出力出来るようにエスケープ処理が実行されています。
Javaの正規表現でエスケープ処理を実行
正規表現でもメタ文字を利用する際に、エスケープ処理が必要になります。
今回はサンプルとして「?(はてなマーク)」の正規表現でエスケープ処理を実施してみましょう。
サンプル
はてなマークは「直前の文字が0または1個であること」を表すメタ文字です。
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String regex1 = "あいう?えお"; String regex2 = "あいう\\?えお"; String str1 = "あいえお"; String str2 = "あいう?えお"; Pattern pattern1 = Pattern.compile(regex1); Pattern pattern2 = Pattern.compile(regex2); Matcher matcher1 = pattern1.matcher(str1); Matcher matcher2 = pattern2.matcher(str1); Matcher matcher3 = pattern1.matcher(str2); Matcher matcher4 = pattern2.matcher(str2); System.out.println(matcher1.matches()); System.out.println(matcher2.matches()); System.out.println(matcher3.matches()); System.out.println(matcher4.matches()); } }
実行結果
true false false true
出力結果の1行目は「あいう?えお」と「あいえお」がマッチするかを確認しており、「う」が省略された際に文字列が一致するため、「はてなマーク」の正規表現に一致し「true」が出力されています。
2行目は「あいう?えお」と「あいう?えお」がマッチするかを確認しているため一見一致しているように感じますが、上述しているように「はてなマーク」が正規表現として機能しているため実際には「false」が出力されます。
3行目と4行目に関しては「あいう\\?えお」つまり「あいう?えお」の文字列と一致するかをチェックしており、「str2」の変数に「あいう?えお」が設定されているため、4行目の出力結果が「true」という結果になりました。
「\\?」とバックスラッシュを2つ記述しているのは「\」自体が特殊文字のため「\」をエスケープ処理する必要があるからです。
さいごに: エスケープ処理を理解してJavaの特殊文字を使いこなそう
本記事では、Javaで特殊文字を表現する際に利用するエスケープ処理の使い方についてご紹介してきました。
エスケープ処理は最初の内は分かりにくいかも知れませんが、頻繁に利用する表現は限られています。
今回ご紹介した定番のエスケープシーケンスや正規表現の基本を抑えておき、検索しながら使いこなせるよう学習を進めてみてください。
9行目11行目13行目に関してはコメントアウトせずに実行しようとしても、Javaの構文に沿わないためコンパイルエラーとなります。