プログラムの中で使われる文字列では、改行のようなキーボードから入力できない文字コードや文字列を囲む記号と同じ記号などを使う場合、特別な文字を使います。これをエスケープシーケンスを言い、Rubyのエスケープシーケンスが「\」(バックスラッシュ)を使うバックスラッシュ記法です。
なおバックスラッシュ記法は文字列の定義の他に正規表現でも利用できるなどRubyのプログラミングでは必須の機能です。今回はRubyのバックスラッシュ記法について紹介します。
エスケープシーケンスとは
エスケープシーケンスとは、改行やタブなどプログラムでは1文字として扱われるものの、キーボードから入力できない文字や文字列を囲む「”」や「’」などを文字列の中で利用するための仕組みです。
まずはRubyに限らずプログラムの中でよく使われるエスケープシーケンスの概要について紹介します。
文字列の中に改行を埋め込むには
プログラムで扱う文字列の途中に改行を入れる方法をご存じでしょうか。テキストエディタやワープロで改行する場合はキーボードのリターンキーを使います。しかし文字列の途中を改行しても、それを改行コードとして処理できる訳ではありません。
文字列の中に改行を埋め込むためには、改行を意味する特殊な文字列を使います。それがエスケープシーケンスです。例えば、Rubyのプログラムの中で、文字列の中に改行を埋め込むには「\n」を使います。
改行を含む文字列の例
message = "処理は正常です。\n次に進んでください。" puts message
上記の文字列を表示した例
処理は正常です。 次に進んでください。
エスケープシーケンスの基本
キーボードを見ると、そのキーを押しても対応する文字や記号の無いキーが幾つがあります。その代表が先ほど紹介したリターンキーで、他にもタブキーやバックスペースなども文字や記号が表示されません。
しかしリターンやタブには文字コードが割り当ててあり、プログラムの中で扱うこともできます。このような機能を特殊な文字によりプログラムで扱えるようにしたのがエスケープシーケンスです。
また、先ほど紹介した文字列をプログラムの中で扱う場合、「”」や「’」で囲うます。これらを文字列の中で使うには、囲う記号と区別しなければなりません。エスケープシーケンスは記号の役割ではなく、記号そのものを使う場合でも利用します。
Rubyではバックスラッシュ記法を使う
Rubyのプログラム内でエスケープシーケンスを扱う場合、バックスラッシュ記法を使います。最初に紹介した改行を埋め込む際に「\n」を使いましたが、バックスラッシュ記法は「\」と続く文字の組み合わせで特殊な文字として扱う方法です。
なおバックスラッシュは日本語キーボードでは¥マークが割り当てられます。そのため、改行コードを「¥n」と表現するケースもあります。
バックスラッシュ記法
先ほど紹介したようにRubyのプログラムで使用する文字列に改行やタブを入れたり、文字列を囲う「”」や「’」といった記号を文字列の中で使う場合は、エスケープシーケンスやとしてバックスラッシュ記法を使います。
次にバックスラッシュ記法を適用する記号と使い方を紹介します。
バックスラッシュとは
アスキーコードに登録された記号で、四則演算の割り算の記号「/」をスラッシュといいます。このスラッシュの左右逆向きの記号「\」がバックスラッシュです。
アスキーコードの16進表記で「0x5C」がバックスラッシュにあたります。なお英語のキーボードには「\」が印字されていますが、日本語キーボードにはありません。アスキーコードの「0x5C」には¥マークが割り当てられているので、これを使ってください。
バックスラッシュ記法で使える機能
次にエスケープ文字として使えるバックスラッシュ記法の例を紹介します。
\t タブ
\v 垂直タブ
\n 改行
\r キャリッジリターン
\f 改ページ
\b バックスペース
\a ベル
\e エスケープ
\s 空白
\\ \そのもの
\’ ‘そのもの
\” “そのもの
なお、\xに続けて2桁の16進数表記で、16表記のアスキーコードを指定することが可能です。また、「\\」や「\”」のように、「\」に続けて記号を指定すると、その記号そのものを表現できます。
文字そのものが使える点に注目
バックスラッシュ記法で実際のプログラムで使よくわれるのはキーボードから入力できない改行の「\n」と文字そのものを指定するケースです。
例えば先ほど紹介した「\\」や「\”」は、Rubyのプログラムの中でSQLやJavaScriptなど他のプログラムを合成するケースでよく使われます。さらに正規表現ではメタ文字と言って特定の文字に機能を割り当てているため、その機能を使うのではなく文字を検索する場合でもバックスラッシュ記法のエスケープシーケンスを利用します。
Rubyのエスケープシークエンス使用例
Ruby on Railsで作るWebシステムは、Rubyのプログラムの中でHTMLやJavaScript、SQLなど他のプログラムコードを合成するケースがよくあります。そしてそのようなケースでよくエスケープシークエンスが使用されます。
次からRubyのエスケープシークエンス使用例として、バックスラッシュ記法の例を紹介します。
文字列の中に改行を含める
冒頭で紹介したようにRubyのプログラムで使用する文字列の中に改行を含めたい場合、バックスラッシュ記法の「\n」を使います。
改行を含む文字列の例
message = "処理は正常です。\n次に進んでください。" puts message
なおLinuxの改行コードは「\n」だけの1文字だけですが、Windowsの改行コードは「\n\r」で2文字です。そして先ほど紹介したように「\n」は改行を、「\r」はキャリッジリターンを意味するエスケープシークエンスです。もしRubyのプログラムの中で改行コードを処理する場合は注意してください。
文字列を囲う文字を使う場合
Rubyのプログラムの中で文字列を使う場合、ダブルクォート「”」またはシングルクォート「’」で囲います。もしシングルクォートで囲う文字列の中で、シングルクォートを使いたい場合、その文字をエスケープシークエンスで記述します。
具体的に次の例を見てください。
シングルクォートを含む文字列の使用例
part = 'user like \'root\';' puts part # user like 'root'; が表示される
この「\’」の使い方は先ほど紹介したバックスラッシュ記法の文字そのものを指定する方法です。同じように文字列の中で「\」を使いたい場合は「\\」を使います。
「\」を含む文字列を使う例
message = '手数料 \\100' puts message # 手数料 \100 が表示される
正規表現のメタ文字を検索する場合
Rubyでは文字列の検索によく正規表現が使われます。そして正規表現には特殊な働きをするメタ文字が使用します。もしメタ文字と同じ文字を含む文字列を検索する場合、バックスラッシュ記法によるエスケープシークエンスによる記述が必要です。
例えば「[」は正規表現のメタ文字です。「[」を含む文字列を正規表現で検索する場合は、バックスラッシュ記法の「\[」を使います。
正規表現で「[」を検索してエラーになる例
strs = "[01/Jan/2020:01:00:00 +0900]" if strs.match(/[/) then puts "OK" end
正規表現では[がメタ文字のため/[/で、エラー「premature end of char-class: /[/」が発生します。そのため、バックスラッシュ記法の/\[/を利用してください。これなら[そのものを検索できます。
strs = "[01/Jan/2020:01:00:00 +0900]" if strs.match(/\[/) then puts "OK" end
まとめ
これまで説明したようにRubyなどのプログラムの中で使われる文字列には、改行や文字列を囲う文字など特殊な文字が含まれます。そのような文字を使う場合はエスケープシーケンスを使用してください。なおRubyでエスケープシーケンスを使用する場合はバックスラッシュ記法を利用します。
バックしラッシュ記法の文字列は、文字列を定義するケースの他、正規表現の検索文字列でも使えます。Ruby on RailsによるWebシステムのプログラムでもバックしラッシュ記法がよく使われるので、ぜひ、使い方をマスターしてください。