Rubyは本来、テキストデータを処理するものです、その中でも最も強力なものがパターンマッチ処理です。パターンマッチ処理とは、文字列の中に特定のパターンと一致する部分があるかどうかを調べることです。パターンと一致した場合に条件を分岐させたり、文字列を置き換えたりすることができるようになります。
正規表現のマッチング
以下の例では、「文字列」の中に「正規表現」で指定した内容と一致する部分があったときに、判断を分岐させるときの例を上げています。 (モード修飾子は英大文字と小文字の区別を無視したりするとき等、パターンマッチの方法を一部変更するときに使います。)
【正規表現がマッチする場合】 if (/正規表現パターン/モード修飾子 =~ 変数) then マッチしたときに実行する命令 end 【正規表現がマッチしない場合】 if (/正規表現パターン/モード修飾子 =! 変数) then マッチしないときに実行する命令 end
正規表現パターンが複数あった場合は、先頭に近いものが選ばれます。マッチすると、式の値は「真」になり、マッチしないと「偽」になるので、if文の条件式にもなります。なお、「 =~ 」の「 ~ 」(チルダ)は、「 ^ 」キー(ひらがなの「へ」のキー)でシフト(Shift)キーを押したまま「 ^ 」キーを押して入力します。
上記のように区切り文字は通常、"/"を使用します。このため、「正規表現パターン」の中に"/"がある場合は、区切り文字との区別がつかなくなるため、"\/"と変更します。ただし、区切り文字を"/"以外にすれば、このような変更を行う必要もなくなります。"/"以外の区切り文字は、「英数字と"_"(アンダーバー)」以外の文字ですが、具体的には、"!"・"#"・"$"・"%"・"&"・ "*"などを使用することができます。区切り文字が"/"以外の場合は、区切り文字の前に"%r"を付けます。"/"のときと同じように、区切り文字に"#"を使い、「正規表現パターン」に"#"を使用する場合は、「正規表現パターン」の中の"#"は"\#"と変更します。
また、かっこなどを使用することができますが、"("と")"、"<"と">"、"{"と"}"、"["と"]"は必ず対応させて使用します。
したがって、以下のようにすることができます。
if (%r!正規表現パターン!モード修飾子 =~ 変数) then マッチしたときに実行する命令 end if (%r#正規表現パターン#モード修飾子 =~ 変数) then マッチしたときに実行する命令 end if (%r$正規表現パターン$モード修飾子 =~ 変数) then マッチしたときに実行する命令 end if (%r&正規表現パターン&モード修飾子 =~ 変数) then マッチしたときに実行する命令 end if (%r*正規表現パターン*モード修飾子 =~ 変数) then マッチしたときに実行する命令 end if (%r(正規表現パターン)モード修飾子 =~ 変数) then マッチしたときに実行する命令 end if (%r<正規表現パターン>モード修飾子 =~ 変数) then マッチしたときに実行する命令 end if (%r{正規表現パターン}モード修飾子 =~ 変数) then マッチしたときに実行する命令 end if (%r[正規表現パターン]モード修飾子 =~ 変数) then マッチしたときに実行する命令 end
モード修飾子には、以下のようなものがあり、それぞれ以下のような意味があります(他にもいろいろなモード修飾子があります)。
このうち、モード修飾子"o"は、以下のような場合に使います。
正規表現パターンを変数で指定した場合、Rubyではパターンマッチするごとに毎回、前処理(コンパイル)を行いますので、処理効率が低下しますが、このオプションを指定すると、Ruby実行時に1回だけ前処理(コンパイル)を行うため、処理効率が上がります。このような場合に、モード修飾子"o"を使います。
s 正規表現の文字列をShift_JISとしてマッチする e 正規表現の文字列をEUC-JPとしてマッチする u 正規表現の文字列をUTF-8としてマッチする n 正規表現の文字列を1バイト文字としてマッチする i 大文字と小文字の違いを無視する。 x 正規表現の中の空白やコメントを無視する。 o パターンの再コンパイルを一度だけ行う。
パターンマッチでエラーになってしまう場合には、全角文字が含まれていたり、スクリプトが"shift_jis"である場合がよくあります。その場合は、正規表現の文字列を"UTF-8"や"EUC-JP"などに変更したり、スクリプトを"UTF-8"にすることで回避できる場合があります(スクリプトと入力ファイルの文字コードは一致させておいたほうがエラーになりにくくなります)。
正規表現による文字列の置換
また、文字列を検索したり、検索した文字列を別の文字列に置き換えたりすることもできます。
以下の例では、「変数」の中に「正規表現」で指定した内容と一致する部分があれば、「置き換える文字列」に変更するときに使います。subメソッドは、正規表現に最初にマッチした文字列だけを置き換えますが、gsubメソッドは正規表現にマッチしたものすべてを置き換えます。
変数.sub(/正規表現/,置き換える文字列)
変数.gsub(/正規表現/,置き換える文字列)
また、置き換えた結果を保存したいときは、sub!メソッドやgsub!メソッドを使うか、別の変数に代入します。
変数.sub!(/正規表現/,置き換える文字列)
変数.gsub!(/正規表現/,置き換える文字列)
別の変数 = 変数.sub(/正規表現/,置き換える文字列)
別の変数 = 変数.gsub(/正規表現/,置き換える文字列)