LoginSignup
3
1

More than 3 years have passed since last update.

[Ruby] match / scan の違い

Last updated at Posted at 2020-09-14

※いくつか類似のページ見つかりますがメモで残しておきます。

実際に書いてみる

# 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

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1