Rubyでは複数の条件に応じて処理を分岐するのにcase~when文を使います。ではwhen文の条件に正規表現を使えるのをご存じでしょうか。
正規表現は、特別な意味を持つ文字を組み合わせることで、複雑文字列のパターン検索が可能な機能で、Rubyに限らず文字列の検索等でよく使われる機能です。そしてRubyではwhen文に指定する条件として正規表現を利用できます。
今回は、case~when文の条件に正規表現を使う方法と、その使用例を紹介します。
Rubyのcase~when文の基本
Rubyでは、複数の条件を分岐する書き方としてif~else文の他にcase~when文を利用できます。使い方はcaseに続いて検査する式を指定し、whenに続けて条件を記述し、さらにelseに続けて条件に合わないケースの処理も記述可能です。
次からRubyにおけるcase~when文の基本について紹介します。
case~when文の文法
case~when文は、先ほど簡単に紹介したように、case句に続けて変数などを使った検査対象の式を指定し、whenに続けて条件式で指定することで、その条件に一致した場合にthenに続いて記述された処理を実行します。そしてcaseに続いて、複数のwhenを指定可能です。
case~when文の文法
case 検査対象の式
when 条件式1 then
条件式1に一致したら実行する処理
when 条件式1 then
条件式1に一致したら実行する処理
…
else
whenで指定した条件式に該当しない場合の処理
end
whenで指定する条件とは
case~when文では、caseで指定した検査対象の式と条件式を、「===」で等しいかどうかをチェックします。
なおRubyには、等価チェックする演算子として「==」と「===」の2つあり、この2つは機能が違います。具体的には文字列や数字は「==」と「===」は同じです。しかし、クラスのインスタンスであるかどうかをチェックしたり、正規表現によるチェックができるのは「===」だけです。
このようにwhenの条件式では「===」で評価するので、条件式として正規表現を使用できます。
whenに続けて正規表現を指定できる
先ほど紹介したように、case~when文ではwhenに続けて正規表現を指定できるので、次のような使い方が可能です。
whenで正規表現を使った例
case postno when /\d{7}/ 数字7桁の場合の処理 when /\d{3}-\d{4}/ 数字3桁と数字4桁の間に「-」を入れた場合 else 間違った入力の場合 end
この例では、whenの条件式として、「/\d{7}/」と「/\d{3}-\d{4}/」の2つの正規表現を使用しています。
Rubyで正規表現を使うには
Rubyのプログラムで正規表現を使うには、スラッシュで囲んだ形式で利用するか、Regexpクラスのオブジェクトを利用します。そして、この2つの書き方は、whenの条件式としても利用可能です。次からRubyの正規表現の書き方を紹介します。
スラッシュで囲む
ifなどの条件式としてよく使われる正規表現が、スラッシュで囲んだ書き方です。正規表現では特別な働きをする文字列をメタ文字といいますが、メタ文字とそれ以外の文字を組み合わせた文字列をスラッシュで囲むと、その文字列が正規表現として扱われます。
例えば、文字列「pat」を含む文字列を正規表現で記述すれば、次のようにスラッシュで囲みます。
文字列「pat」を含む正規表現
/pat/
またメタ文字「[a-z]」を含む正規表現を作る場合、次のように記述します。
メタ文字「[a-z]」を含む正規表現
/[a-z]/
if構文で正規表現を使う例
if target =~ /pat/ then puts "/pat/ に一致" end
Regexpクラスのオブジェクトを作る
Rubyで正規表現を利用する場合、Regexpクラスのnewメソッドでオブジェクトを作成し、それを先ほどのスラッシュで囲った正規表現の代わりに使うことも可能です。そしてこのオブジェクトはwhenに続く条件式にも使用できます。
先ほどのスラッシュで宣言した正規表現をRegexpクラスのオブジェクトとして作成した例が次のとおりです。
Regexpクラスのオブジェクトの例
chk1 = Regexp.new("pat") # /pat/と同じ chk2 = Regexp.new("[a-z]") # /[a-z]/と同じ
if構文で正規表現のオブジェクトを使う例
chk1 = Regexp.new("pat") if target =~ chk1 then puts "Regexpオブジェクトに一致" end
whenで正規表現を使う方法
先ほど紹介したように正規表現を使う場合、//で囲う書き方とRegexクラスのオブジェクトを利用する方法とがあり、どちらもwhen句で利用可能です。次からwhen句で正規表現を利用する方法を、例を使って解説します。
スラッシュで囲う書き方
正規表現で検索したいパターンの文字列が決まっている場合、スラッシュ「/」で囲む書き方を使います。例えばcaseでチェックしたい文字列が7桁の数字だった場合の処理をcase~whenで書いた例を次に紹介します。
whenでスラッシュを使った正規表現の例
case postno when /\d{7}/ puts "7桁の数字です" when /\d{3}-\d{4}/ puts "3桁-4桁の表現です" else puts "間違っています" end
正規表現のオブジェクトを用いる
先ほど紹介したようにRegexクラスを使うことで、正規表現のオブジェクトを作ることが可能です。そしてcase~whenで正規表現を利用する場合、先ほど紹介したスラッシュで囲う書き方の代わりに正規表現のオブジェクトを指定できます。
正規表現のオブジェクト使ったcase~whenの例
chk1 = Regexp.new("\\d{7}") chk2 = Regexp.new("\\d{3}-\\d{4}") case postno when chk1 puts "7桁の数字です" when chk2 puts"3桁-4桁の表現です" else puts"間違っています" end
この例では、正規表現の「/\d{7}/」を格納したオブジェクトchk1と正規表現の「\d{3}-\d{4}」を格納したオブジェクトchk2を使った例です。
正規表現を合成してチェックする
先ほど、Regexp.new()メソッドで文字列から正規表現のオブジェクトを作成してwhenで検索する方法を紹介しましたが、正規表現作成に用いる文字列はプログラムの中で合成できます。
例えば、次のように文字列を組み合わせて正規表現を作り、case~when構文で処理を分岐するプログラムを書くことが可能です。
複数の文字列から正規表現を作ってcase~whenで分岐する例
years = ["2021", "2020", "2019"] code = "[a-z][a-z]\\d{3}" chk1 = Regexp.new(years[0]+code) chk2 = Regexp.new(years[1]+code) chk3 = Regexp.new(years[2]+code) case pno when chk1 puts years[0] + "に一致しました" when chk2 puts years[1] + "に一致しました" when chk3 puts years[2] + "に一致しました" else puts "該当はありません" end
まとめ
Rubyのcase~when構文を使用することで、複数のifを使うよりも読みやすいプログラムを記述できます。さらにwhenは正規表現も使えるので、複雑なパターンに一致したらそれぞれ処理を分岐させるプログラム作成も可能です。
なおRubyでは、スラッシュで囲む正規表現の書き方とRegexpクラスを用いた正規表現のオブジェクトを利用できます。今回紹介したようにメタ文字やパターンの組み合わせの文字列を合成し、正規表現のオブジェクトにしてwhenで利用することも可能です。
case~when構文の処理で求められる条件式に合わせて、うまく活用してください。
case~when句では正規表現以外にも、他のプログラミング言語には無い便利な機能があります。興味のなる方は、下記の記事も参照してください。
【Ruby入門】case文の基本とRubyらしい応用例の書き方