0Pricing
Ruby Academy · レッスン

マッチングとキャプチャ

match とキャプチャです。

「マッチングとキャプチャ」はCoddyKit上の無料Ruby Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはRuby Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Ruby Academyコースには全4レッスンが含まれています。

MatchDataオブジェクト

regex.match(string)を呼び出すと、成功時にはMatchDataオブジェクトが返され、失敗時にはnilが返されます。

MatchDataには、マッチしたテキストとキャプチャされたグループが格納されます。

m = /world/.match('hello world')
puts m.class
puts(m[0])

マッチ全体:インデックス0

MatchDataのインデックス0には、グループの有無にかかわらず、常にマッチした部分文字列全体が入ります。

m = /\d+/.match('order 4521 shipped')
puts(m[0])
puts(m.to_s)

キャプチャグループ

丸括弧( )を使うとキャプチャグループを作成できます。各グループには1から始まる番号でアクセスできます。

m = /(\d{4})-(\d{2})/.match('2026-05')
puts(m[1])
puts(m[2])

capturesメソッド

capturesは、キャプチャされたすべてのグループを配列として返します(インデックス0のマッチ全体は含まれません)。

m = /(\w+)@(\w+)/.match('alice@example')
p m.captures

キャプチャの分割代入

capturesは配列を返すため、その結果を変数に直接分割代入できます。

user, host = /(\w+)@(\w+)/.match('bob@server').captures
puts user
puts host

マッチ前後のテキスト

MatchDataには、マッチの前後にあるテキストを取得するメソッドがあります。

  • pre_matchはマッチの前の部分
  • post_matchはマッチの後の部分
m = /\d+/.match('abc123xyz')
puts(m.pre_match)
puts(m.post_match)

scanですべてのマッチを検索

String#scanは、最初の1件だけでなく、文字列内のすべてのマッチを配列として返します。

nums = '12 cats, 8 dogs, 3 birds'.scan(/\d+/)
p nums

scanとグループ

パターンにグループがある場合、scanはマッチごとに1つの配列を持つ配列を返します。各配列には、そのマッチのキャプチャが格納されます。

pairs = 'a=1 b=2 c=3'.scan(/(\w)=(\d)/)
p pairs

nilを安全に扱う

matchは何もマッチしないとnilを返すことを常に覚えておいてください。結果を使う前に、nilでないことを確認します。

m = /(\d+)/.match('no digits here')
if m
  puts m[1]
else
  puts 'no match found'
end

特殊変数

マッチに成功すると、Rubyはグローバル変数を設定します。$~はMatchData、$1や$2は番号付きキャプチャです。

これらは短いスクリプトでは便利ですが、実際のコードではMatchDataを明示的に扱うほうが分かりやすくなります。

if 'name: Alice' =~ /name: (\w+)/
  puts $1
end

日付の抽出

グループとキャプチャを組み合わせると、文字列から構造化されたデータを1ステップで取り出せます。

year, month, day = /(\d{4})-(\d{2})-(\d{2})/.match('2026-05-29').captures
puts "Year #{year}, Month #{month}, Day #{day}"

簡単な確認

'a=1 b=2'.scan(/(\w)=(\d)/)を実行した場合、結果はどのような形になりますか。

まとめ:マッチとキャプチャ

これで、マッチした部分からデータを抽出できるようになりました。

  • matchはMatchDataまたはnilを返す
  • インデックス0はマッチ全体、1以降はグループ
  • capturesはすべてのグループを配列として返す
  • scanは文字列内のすべてのマッチを見つける
  • 常にnilを考慮して処理する
p 'x1 y2 z3'.scan(/([a-z])(\d)/)

よくある質問

「マッチングとキャプチャ」レッスンは無料ですか?

はい。「マッチングとキャプチャ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Ruby Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Ruby Academyコースには全4レッスンが含まれています。

「マッチングとキャプチャ」で何を学びますか?

match とキャプチャです。 ブラウザで直接実行するハンズオンコードでRuby Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Ruby Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのRuby Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「マッチングとキャプチャ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このRuby Academyレッスンでコードを書いて実行できますか?

はい。すべてのRuby Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 正規表現リテラル
  2. マッチングとキャプチャ
  3. 置換
  4. 名前付きグループとアンカー
← Ruby Academyに戻る