※いくつか類似のページ見つかりますがメモで残しておきます。
実際に書いてみる
# irb
a = "barfoobazfoobaofoo"
# matchの場合
a.match(/ba./)
=> #<MatchData "bar">
# scanの場合
a.scan(/ba./)
=> ["bar", "baz", "bao"]
matchは、 MatchData
オブジェクトが返ってきて
scanは、配列で返ってくる。
正規表現でマッチしない場合
# irb
# match
a.match(/baa./)
=> nil
# scan
a.scan(/baa./)
=> []
matchは、nilが返ってきて、
scanは空の配列が返ってくる。
考察
考察1
matchは配列を返さないので、結果をループ処理しようとするとエラーになる。
scanは配列を返すので、ループ処理できる。
(と言うかscanはそのままブロックを渡して処理できるからこんなことできる↓)
# irb
a.scan(/ba./) {|s| p s*2}
"barbar"
"bazbaz"
"baobao"
考察2
matchはnilを返すので、条件分岐の時falseになる。
scanは[]なので、条件分岐でtrueになってしまうから注意。
参考
https://docs.ruby-lang.org/ja/latest/method/String/i/match.html
https://docs.ruby-lang.org/ja/latest/method/String/i/scan.html