• WebCamp_インタビュー
    時間や場所にとらわれず自由に働くために必要なスキルとは?【WebCamp卒業生インタビュー】
    2018.01.26
  • WebCamp_インタビュー
    【卒業生インタビュー】台湾で月間100万UUの訪日旅行メディアを手掛けるCEOが、プログラミングを学んで得たものとは?
    2018.01.15
  • WebCamp_インタビュー
    【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!
    2018.01.15
  • WebCamp_インタビュー
    「自信の持てるスキルを得たい!」内定辞退した女子大生がプログラミングを学習したワケ。
    2018.04.28
  • WebCampPro_インタビュー
    未経験でも寿司職人からWebデザイナーになった!ホスピタリティでスクールを支える宮脇トレーナー
    2017.05.26
  • WebCamp_インタビュー
    「1カ月頑張ればこの先が見えてくる」地元メディアを立ち上げたママさん
    2017.07.20
  • WebCampPro_インタビュー
    未経験31歳からエンジニア転職を実現【実際に聞いてみた】
    2017.04.01
  • WebCamp_インタビュー
    【WebCamp受講生インタビュー】起業準備中にCEOが気がついたプログラミングスキルの重要性とは?
    2017.12.25
  • WebCamp_インタビュー
    “未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー
    2017.10.04
  • WebCampPro_インタビュー
    自分で稼ぐ力をつけるため、新卒5年目の営業マンがエンジニアに転職!【WebCampPro転職者インタビュー】
    2018.02.02
  • WebCampPro_インタビュー
    未経験から上京し、エンジニアとしてチームラボグループに転職!【WebCampPro卒業生インタビュー】
    2018.03.10

◆当サイトで人気のプログラミング教室のおすすめランキングはこちら!
プログラミングは独学では非効率で、時間を無駄にするリスクがあります。効率的なカリキュラムで学べるスクールを受講しましょう。

WEBCAMP【マンツーマンサポート】1ヶ月短期集中でプログラミングを学ぶスクール
1ヶ月通い放題・メンター常駐の教室環境でプログラミングを学びたい方!
TechAcademyオンラインで開講しているプログラミングスクール
オンラインでどこでも学べる!/教室に行くのが忙しい人でも安心!
Tech Camp教養としてのITスキルを学べるスクール
Webデザイン/AI(人工知能)/IOS/Androidアプリ制作/VRを学びたい方!
WEBCAMP PRO転職保証付き!エンジニアとして転職したい人におすすめ!
未経験からプロのエンジニアへ3ヶ月で転職する為のスクールです!
12月生募集中!当社人気の転職保証コース
プログラミング学習から転職成功まで導く、当社人気のWebCamp Proコース。
11月生は満員となっております。12月生募集に向け、お早めの申込みをオススメします。
プログラミング未経験でもエンジニア転職を絶対成功させたい
スキルを身に着けて人生を自ら切り開きたい
上記にあてはまる方は、ぜひご検討ください!

Rubyで文字列操作をするにあたって避けられないのが、正規表現です。

正規表現を利用することで、文字列内を検索して、パターンに一致したものを取り出したり、削除したり、差し替えたりといったことがシンプルな記述で可能になります。

ここでは、そんな正規表現を使ってパターン検索するメソッドmatchについて、詳しく解説します。

最後に正規表現のメタ文字一覧も掲載しています。また、サンプルプログラムを多めにしていますので、正規表現をきちんと確認しながら、使い慣れていってください。
※詳細な解説は「【Ruby入門説明書】正規表現について解説」を参照してください

正規表現を使えれば、Rubyの価値はもっともっと上がります。

Rubyのmatchは2種類

じつは、Rubyのmatchメソッドには、RegexpクラスのmatchメソッドとStringクラスのmatchメソッドの2種類があります。

どちらも正規表現を使って文字列内のパターン検索を行うことに違いはありません。

それぞれ、詳しく紹介しましょう。

Stringクラスのmatch

Stringオブジェクトから利用するmatchメソッドは、以下のように2種類の構文があります。

Stringオブジェクト.match(正規表現, 開始位置=0)
Stringオブジェクト.match(正規表現, 開始位置=0) do |ブロック引数|
  処理
end

Stringオブジェクト内を正規表現でパターン検索し、マッチした文字列を格納したMatchDataオブジェクトを返します。もしマッチしなければ、nil(無効値)が返されます。

なお、第2引数の開始位置は、検索開始位置です。デフォルト値が0になっていますので、渡さなければ0(先頭)から検索します。

str = "Hello Ruby world!"
reg = /\s\w+/

md = str.match(reg)
p(md[0]) 
md = str.match(reg, 10)
p(md[0])

(結果)

" Ruby"
" world"

なお、MatchDataは検索結果が配列の形で格納されており、最初の要素(要素番号0)には、マッチした文字列、2つめ以降(1~)については正規表現の中で()で囲まれたものが先頭から順番に格納されます。

str = "Hello Ruby world!"
reg = /\s(\w+)\s(\w+)/

md = str.match(reg)
p(md[0]) 
p(md[1])
p(md[2])

(結果)

" Ruby world"
"Ruby"
"world"

また、ブロックを渡した場合は、ブロック引数にMatchDataが格納されます。なお、複数マッチする場合でも、最初にマッチした結果のMatchDataが格納されるだけですので、注意が必要です。

match00-1.rb

str = "Hello Ruby world!"
reg = /\s(\w+)\s(\w+)/

str.match(reg) do |md|
  p(md[0])
  p(md[1])
  p(md[2])
end

(結果)

" Ruby world"
"Ruby"
"world"

Regexpクラスのmatch

Regexpオブジェクトでmatchメソッドを利用することでも、同じ結果を得ることができます。

その場合の構文は、以下です。

Regexpオブジェクト.match (文字列, 開始位置=0)
Regexpオブジェクト.match (文字列, 開始位置=0) do |ブロック引数|
  処理
end

先ほど紹介した、Stringオブジェクトから利用するmatchメソッドの構文とまったく同じです。ただ、StringオブジェクトとRegexpオブジェクトが入れ替わっているだけです。(文字列はStringオブジェクト、正規表現はRegexpオブジェクトです)

また、引数の意味も、ブロックを渡した場合の動きもまったく同じになっています。

なぜなら、Stringオブジェクトのmatchメソッドは、内部的にこのRegexpオブジェクトのmatchを利用しているからです。

念のため、match00-1.rbのStringオブジェクトとRegexpオブジェクトを入れ替えたプログラムで動作を確認しておきましよう。

match00-2.rb

str = "Hello Ruby world!"
reg = /\s(\w+)\s(\w+)/

reg.match(str) do |md|
  p(md[0]) 
  p(md[1])
  p(md[2])
end

(結果)

" Ruby world"
"Ruby"
"world"

もう一つ、例を紹介しておきます。

str = "我が輩は猫である。名前はまだない。"

reg = Regexp.new(/^(.*)。./)   # (1)
reg.match(str) do |md|
  p(md[1])
end

reg = /。(.*。)$/
reg.match(str) do |md|
  p(md[1])
end

(1)では、引数に正規表現を渡して、Regexpオブジェクトを生成しています。

単純に/~/で囲った正規表現を変数に代入するだけで、Regexpオブジェクトを生成することができますので、敢えてnewメソッドで生成しなくても良いですが、プログラムを正しく理解する上では必要です。

なぜなら、代入の処理でも、実際には内部でRegexpオブジェクトの生成が行われているからです。

結果がどうなるか予測してから、動かしてみてください。

“未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー
2017-10-04 10:26
今回の記事では、未経験からWebCampを1ヶ月受講し、その後エンジニアとして転職をした喜田さんにお話を伺いました。 <プロフィール> 喜田 大介 さん (28歳) 大学時代はプ...

どちらのmatchを使うべきか?

ここまで説明したように、matchメソッドは、StringクラスとRegexpクラスのそれぞれに定義されています。

もちろん、どちらを使っても同じ結果を得られますので、どちらが良いということはありません。

しかし、「プログラムの流れを理解しやすい」かどうかを考慮することで、おのずとどちらのmatchメソッドを使えば良いかが決まってきます。

単純な例を挙げましょう。

1.「ある特定の文章」から数種類の文字列を取り出す
2.「複数の文章」から特定の文字列を取り出す

この2つのパターンは、それぞれStringクラスのmatchメソッドとRegexpクラスのmatchメソッドのどちらを使った方がプログラムの流れを理解しやすいでしょうか?

1.については、1つの文章に対して、いくつもの正規表現でマッチさせることになります。つまり、Stringオブジェクトを中心にして、Regexpオブジェクトを渡していくことになるでしょう。

file_path = "C:\\development\\Ruby\\match01.rb"

md = file_path.match(/\\(\w+\..*)$/)
filename = md[1]
md = file_path.match(/^(.*\\)+/)
path = md[0]

print("filename = #{filename} path = #{path}\n")

(結果)

filename = match01.rb path = C:\development\Ruby\

逆に、2.の場合は、いくつもの文章に特定の正規表現でマッチさせるわけですから、次のプログラムのように、Regexpオブジェクトに対して、Stringオブジェクトを渡す方がスムーズに理解できるのではないでしょうか?

numbers = ["080-9401-0555",
           "06-645-6464",
           "090-1111-2222",
           "03-323-3333",
           "070-7777-8888"]

reg = /(\d{2,3})/

numbers.each do |number|
  area_code = reg.match(number) do |md|
    md[1]
  end
  p(area_code)
end

(結果)

"080"
"06"
"090"
"03"
"070"

=~メソッドでもパターン検索できる

Stringクラスの=~メソッドは、文字列が正規表現とマッチした場合は要素番号、マッチしなければnilを返すメソッドです。

そのため、ただ正規表現とパターンマッチするかどうかだけを知りたいのであれば、=~メソッドを使うほうがシンプルかもしれません。

numbers = ["080-9401-0555",
           "06-645-6464",
           "03-323-3333",
           "0707-777-888899"]

reg = /\d{2,4}-\d{3,4}-\d{4}$/

numbers.each do |number|
  if number =~ reg
    p("#{number}は、電話番号です")
  else
    p("#{number}は、電話番号ではありません")
  end
end

(結果)

"080-9401-0555は、電話番号です"
"06-645-6464は、電話番号です"
"090-1111-2222は、電話番号です"
"03-323-3333は、電話番号です"
"0707-777-888899は、電話番号ではありません"

コツコツ独学×スクールで実践。未経験からエンジニアに転職!【WebCamp卒業生インタビュー】
2018-03-22 23:28
今回の記事では、独学でPHPを1年半学習し、その後WebCampを受講して未経験からエンジニアへと転職された佐々木さんにお話を伺いました。 <プロフィール> 佐々木 祐樹 さん(2...

正規表現のメタ文字

正規表現については、「【Ruby入門説明書】正規表現について解説」を参照していただきたいですが、念のため、パターン検索に使うメタ文字の一覧は掲載しておきます。

正規表現 意味
^ 行頭 /^abc/ → abcで始まる行
$ 行末 /abc$/ → abcで終わる行
. 改行を除く任意の1文字 /a.b/ → aとbの間に任意の文字1文字が挟まっている
[...] []内のいずれか1文字 /[A-Za-z]/ → 英字
[^...] [ ]内に含まれない1文字 /[^0-9]/ → 数字以外(数字の場合は/[0-9]/)
* 0回以上の繰り返し /a.*/ → aの0回以上の繰り返し
+ 1回以上の繰り返し /a+/ → aの1回以上の繰り返し
{m} m回の繰り返し /[0-9]{3}/ → 000から999の数字
{n,} n回以上の繰り返し /S{3}/ → 3個以上繰り返されているS(SSS、SSSS、SSSSS...)
{m,n} m回以上n回以下の繰り返し /S{2,3}/ → 2個か3個繰り返されているS(SS、SSS)
? 0回または1回 /aa?/ → aまたはaa
a|b aまたはb /ABC|abc/ → ABCまたはabcの行
(...) グループ化 /(ABC)+/ → ABCの1回以上の繰り返し
\w 英数字と_ /^\w+$/ → 英数字のみの行
\W 英数字と_以外 /Hello,\WWorld/ → Hello,とWorldの間に英数字以外の文字列
\s 空白文字 /Hello,\sWorld/ → Hello,とWorldの間に空白1文字
\S 空白文字以外 /Hello\SWorld/ → HelloとWorldの間に空白以外の文字
\d 数字 /a\d/ → aと数字1文字
\D 数字以外 /a\D/ → aと数字以外の1文字
\ メタ文字を文字にする /\./ → 「改行を除く任意の1文字」ではなく「.」

問題「生年月日」

次のデータから生年月日を取得してください

birthdays = ["生年月日は2002/02/02です",
             "2002年3月5日に生まれました。",
             "1980年8月12日",
             "2010/3/16だよ"]

時間や場所にとらわれず自由に働くために必要なスキルとは?【WebCamp卒業生インタビュー】
2018-01-26 13:03
今回の記事では、WebCampに1ヶ月間通い、未経験からエンジニアとして転職した星野さんにお話を伺いました。 <プロフィール> 星野 智洋 さん(25) 学生時代は日本大学芸術学部...

まとめ

Rubyのmatchメソッドは、文字列と正規表現がマッチするかを確認し、マッチした部分文字列を取得することができるメソッドです。

つまり、文字列に含まれた情報を抽出して処理するための前準備をするメソッドと言えるでしょう。

前準備ですので、様々な処理の前に利用されることが想定されているため、StringオブジェクトからもRegexpオブジェクトからも使えるよう、両方のクラスに定義されているのだと思います。

しかし、複数のクラスで同じメソッドが実装されている場合、考えてメソッドを使わないと、プログラムの意図が伝わりにくくなってしまいます。ぜひ、読みやすさを重視した最適な選択ができるよう、練習していってください。

また、正規表現は慣れなければいつまで経っても理解に苦しむ鬼門とも言えます。そのため、正規表現に触れる機会をできるだけ増やすことをおすすめします。

・Rubyのmatchメソッドには、RegexpクラスのmatchメソッドとStringクラスのmatchメソッドの2種類がある
・RegexpクラスのmatchメソッドとStringクラスのmatchメソッドはまったく同じ動作をする
・matchメソッドは、正規表現にマッチした部分文字列をMatchDataオブジェクトとして返してくれる
・matchメソッドにブロックを渡すことで、ブロック内でMatchDataオブジェクトを処理し、その結果を返すことができる
・RegexpクラスのmatchメソッドとStringクラスのmatchメソッドは、プログラムの読みやすさを考慮して使い分ける

問題の答え

birthdays = ["生年月日は2002/02/02です",
             "2002年3月5日に生まれました。",
             "1980年8月12日",
             "2010/3/16だよ"]

reg = /\d{4}[\/|年]\d{1,2}[\/|月]\d{1,2}日*/

birthdays.each do |birthday|
  day = birthday.match(reg)
  p(day[0])
end

WebCampOnline プログラミングコースについて

WebCampでは、「どこでも学べる」オンラインコースを開講しています。

初心者・未経験の方でもわずか1ヶ月でプログラミングの基礎を学び、アプリケーション開発をすることができます。

WebCampOnlineが選ばれる3つの理由

1.学習の仕方がわからなくても安心!初心者に寄り添った学習カリキュラム

これから学習を始める初心者の方や、独学で挫折してしまった方に向けて、アプリケーション作成をゴールとする一気通貫したカリキュラムを提供しています。2500名を輩出しているWebCampだからこその教室でのリアルな受講生の声を反映し、オンラインコースでも初心者に寄り添った学習体験をご提供いたします。

2.つまずいたらすぐ解決!プロのエンジニアに質問し放題

プログラミング学習で挫折する理由の多くは「つまずいた時に聞ける人がいない」ことです。オンラインコースでは、現役エンジニアやプロ講師に、すぐにチャットでの質問が可能です。つまずきをすぐに解消できるので、挫折せずに学習を継続することができます

3.1ヶ月間で終わらなくても大丈夫!カリキュラムは"卒業後"も"無料"で利用可能

受講したいけど、仕事が急に忙しくなるかもしれないから受講するか迷っている・・・そんな方も多いのではないでしょうか?ご安心ください。カリキュラムは期間終了後も「無料」で使うことができます。また、しっかり学習時間を確保した方も、振り返って学習することでプログラミングスキルがご自身に馴染んできます。

▼まずは無料でWebデザインのカリキュラムを体験しよう!

【インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!

ブラジルから帰国し技術をつけようとRubyエンジニアを目指してWebCampでRubyを学び、見事Webエンジニアとして転職を果たした田中さんにお話を伺いました。

Rubyの学習がしたい。基礎をしっかりと理解したい

転職のサポートがほしい

と考えている方はぜひお読み下さい。

【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!
2018-01-15 13:23
今回の記事では、WebCampで1ヶ月間Rubyを学習し、Webエンジニアとして転職した卒業生の田中さんにお話を伺いました。 <プロフィール> 田中 デニス 昭彦さん(...
関連キーワード
Rubyの関連記事
  • 【Ruby入門説明書】rescueについて解説
  • 【Ruby入門説明書】jsonについて解説
  • 【Ruby入門説明書】csvについて解説
  • 【Ruby入門説明書】mapについて解説
  • 【Ruby入門説明書】gemsについて解説
  • 【Ruby入門説明書】ruby sliceについて解説
おすすめの記事