Rubyの文法(2) 文字リテラルと正規表現

1.文字リテラル
ダブルクォーテーションかシングルクォーテーションで囲んだものを文字リテラルといいます。


"Alpha"
'Beta'

しかしダブルとシングルとでは動きが少し異なります。
タブルクォーテーションの中では式展開ができ、
シングルクォーテーションの中では式展開はできないということです。

NetBeansから[Railsコンソール]を起動して確認してみましょう。

Railsコンソール

Loading development environment (Rails 2.3.4)
>> a=["Alpha", "Beta", "Gamma"]
>> p a[1]
"Beta"
>> p "The second element is #{a[1]}."
"The second element is Bata."
>> p 'The second element is #{a[1]}.'
"The second element is \#{a[1]}."


このように"#{a[1]}"は、#{ }で囲まれたa[1]を解釈し表現します。
これを式展開といいます。
しかし'#{a[1]}'は、そのままの文字列として扱います。

そのままといいながら、
出力結果は"\#{a[1]}"となっているではないか
と疑問を持たれる方がいるかもしれません。

これはバックスラッシュ記法を使って正しく文字列の内容を伝えるために取られた結果だからです。
\#とは、#そのもので#に特殊な意味を持たないことを示してします。

Rubyでは、このバックスラッシュ記法を使って特別な文字を定義しています。

\t タブ(0x09)
\n 改行(0x0a)
\r キャリッジリターン(0x0d)
\f 改ページ(0x0c)
\b バックスペース (0x08)
\a ベル (0x07)
\e エスケープ (0x1b)
\s 空白 (0x20)
\nnn 8進数表記 (n は 0-7)
\xnn 16進数表記 (n は 0-9,a-f)
\cx\C-x コントロール文字 (x は ASCII 文字)
\M-x メタ x (c | 0x80)
\M-\C-x メタ コントロール x
\x 文字 x そのもの

Railsコンソール

>> p "\101\102\103"
"ABC"


2.正規表現

(1) メタ文字

いくつかの文字列を一つの形式で表現するための表現方法です。
この表現方法を使うことで文字列検索が容易になります。(?)
Rubyでは/で囲んで正規表現であることを示します。

例えば、GoldかSilverという場合は次のように書きます。


/Gold|Silver/

ここで | という文字を使っていますが、
正規表現ではいくつかの文字を特殊文字として扱いメタ文字と呼んでいます。


. ^ $ [ ] * + ? | ( ) \

メタ文字として使用したくないときは、頭に \ をつけます。
こうすることで本来の文字になります。


\. \^ \$ \[ \] \* \+ \? \| \( \) \\

それでは元素名一覧を使って書き方を紹介しましょう。


(2) 一文字のワイルドカード .

/a.c/とすればCalcium,Franciumが該当します。


(3) 行の先頭 ^

/^D/とすればDubnium,Darmstadium,Dysprosiumが該当します。


(4) 行の最後 $

/er$/とすればSilver,Copperが該当します。sulfurは最後がerでないので該当しません。
/^Iron$/とすればIronそのもので成り立っている場合のみ該当します。仮にIroniumなどがあっても対象となりません。


(5) 同じ文字の繰り返し * + ? {n} {n,} {n,m}

/ni*um/とすればActinium,Aluminum,Californiumなどが該当します。
*は直前の一文字がゼロ個以上ある場合に使います。したがってnumやniiiumなども対象となります。

/ni+um/とすればActinium,Californium,Dubniumなどが該当します。
+は直前の一文字が一個以上ある場合に使います。したがって*のようなnumは対象となりません。

/el?i/とすればBerkelium,Einsteinium,Helium,Meitenerium,Nobeliumが該当します。
?は直前の一文字がゼロか一個ある場合に使います。したがってei対象となりますがellliなどは対象となりません。

/t{2}/とすればYttrium,Ytterbiumが該当します。
c{n}は文字tがn個続くことを表します。

/l{2,}/とすればBeryllium,Gallium,Palladium,Tellurium,Thalliumが該当します。
c{n,}は文字tがn個以上続くことを表します。

/l{1,2}/とすればSilver,Aluminum,Gold,Beryllium,Berkeliumなどが該当します。
c{n,m}は文字tがn個からm個続くことを表します。


(6) ワイルドカード .*

/Ca.*m/とすればCalcium,Cadmium,Californiumが該当します。
.*は任意の文字がゼロか一個以上ある場合に使います。したがってcamやcaxmやcaxyzmが対象となります。
ここでCadmではなくCadmiumまで検索することに注意してください。
途中で条件が満たされてもまだ対象文字が続くなら最後まで検索します。


(7) 何れかの文字 [xyz] \w \d

/xxx[ABC]zzz/とすればxxxAzzzかxxxBzzzかxxxCzzzのいずれかが該当します。
/xxx[A-Z]zzz/とすればアルファベット大文字が対象の位置に入っていれば該当することになります。
/xxx[^A-Z]zzz/とすればアルファベット大文字が対象の位置に入っていると該当しないことになります。
ここでは^は否定の意味になります。

/[0-9]/は数字で、/[^0-9]/は数字以外ということになります。

/\w/は英数字を表ときに使い[0-9a-zA-Z_]と同じ意味です。

/\d/は数値を表すときに使い[0-9]と同じ意味です。



(8) 選択

/gold|silver/とすればSilver,Goldが該当します。



(9) グループ化

*,+,?,{n}では直前の一文字を対象としていましたが、グループ化することで文字列を対象とすることができます。
/xxx(ABC)+zzz/とすればxxxABCzzz,xxxABCABCzzzなどが該当することになります。


(10) 実用サンプル

郵便番号 /\d{3}-\d{4}/
電話番号 /\d{2,4}-\d{2,4}-\d{4}/
電子メール /[0-9a-zA-Z._-]+@[0-9a-zA-Z_-]+\.[0-9a-zA-Z._-]+/
URL /http.?://[\w\d/%#$&?()~_.=+-]+/