Rubyリファレンス: Home

scan (String)

Edit   History

標準クラス・モジュール > String > scan

str.scan(pattern)

scanメソッドは、引数で指定した正規表現のパターンとマッチする部分を文字列からすべて取り出し、配列にして返します。マッチする部分がなければ、空の配列を返します。

引数に文字列を指定したときは、一致する部分文字列をすべて配列に取り出します。

次の例は、文字列の中から英単語を取り出すものです。

s = "of the people, by the people, for the people"
p s.scan(/\w+/)
p s.scan("people")
["of", "the", "people", "by", "the", "people", "for", "the", "people"]
["people", "people", "people"]

正規表現のパターンの中に( )がある場合は、( )に当てはまる部分を並べた配列の配列を返します。次の例は、カンマとコロンで区切られた文字列を元に、2つの単語からなる配列の配列を作ります。

s = "Hokkaido:Sapporo, Aomori:Aomori, Iwate:Morioka"
p s.scan(/(\w+):(\w+)/)
[["Hokkaido", "Sapporo"], ["Aomori", "Aomori"], ["Iwate", "Morioka"]]
str.scan(pattern) {|match, ...| block }

scanメソッドにブロックを与えると、引数のパターン(または文字列)と一致する部分を繰り返し取り出してブロックを実行します。ブロック引数には一致した部分が入ります。メソッドの戻り値はレシーバ自身です。

次の例は、ハッシュを使って文字列中の単語の数を単語別に数えるものです。

s = "of the people, by the people, for the people"
hash = Hash.new(0)
s.scan(/\w+/) {|word| hash[word] += 1 }
p hash
{"of"=>1, "the"=>3, "people"=>3, "by"=>1, "for"=>1}

正規表現のパターンの中に( )がある場合は、( )に当てはまる部分がブロック引数に入ります。( )が複数あるときはブロック引数を複数記述できます。

次の例は、カンマとコロンで区切られた文字列を元にハッシュを作っています。

s = "Hokkaido:Sapporo, Aomori:Aomori, Iwate:Morioka"
hash = {}
s.scan(/(\w+):(\w+)/) do |word1, word2|
  hash[word1] = word2
end
p hash
{"Hokkaido"=>"Sapporo", "Aomori"=>"Aomori", "Iwate"=>"Morioka"}

関連項目