LoginSignup
0

More than 3 years have passed since last update.

初学者によるプログラミングMemo #17 scanメソッド

Posted at

はじめに

今回はscanメソッドを使用するお話です
なお、本記述はMacにおいて、Railsでの開発を前提としています
また、まだまだひよっこですので、不備等ございましたらご指摘いただけると幸いです

目次

  • "scan"メソッドについて
  • 正規表現での特徴

"scan"メソッドについて

scanメソッドは「ある文字列に対して、マッチさせたい文字を指定し、マッチした部分文字列を配列として返す」メソッドです
使い方を具体的に見てみましょう

基本

"調べる元となるの文字列".scan"調べたい文字列(or正規表現)"

以下のような記述があるとします

sample1.rb
word = "foobar"

p word.scan(/ba/)
# p word.scan("ba") これも同じ結果

=> ["ba"]

結果として得られるのは["ba"]です
文字列を変えてみましょう

sample2.rb
key = "foobarbarbazz"

p key.scan(/ba/)

=> ["ba", "ba", "ba"]

この場合、"ba"は3回出てくるため、sample1.rbから結果は変わりました
このように、ある文字列に対してその文字が入っているか検索をかけてくれると考えてもいいでしょう
ただし、結果は配列で返ってくるため、単純に回数だけ知りたい場合は"length"メソッドをつけましょう

sample3.rb
key = "foobarbarbazz"

p key.scan(/ba/).length

=> 3

ブロックに渡して実行する

配列として返さない方法もあります

sample4.rb
hoge = "foobarbazfoobarbaz"

hoge.scan(/ba/) {|s| p s }

=> "ba"
   "ba"
   "ba"
   "ba"

正規表現での特徴

正規表現を使用するとき、"()"でくくってやると、その部分にマッチした「部分文字列の配列」の配列を返します
ややこしいので実際に挙動を見ましょう

sample5.rb
hoge = "foobarbazfoobarbaz"

p hoge.scan(/(ba)(.)/)

=> [["ba", "r"], ["ba", "z"], ["ba", "r"], ["ba", "z"]]

こんな感じです
マッチした「部分文字列の配列」の配列を返してくれています
もちろんブロックパターンも使えます

sample6.rb
hoge = "foobarbazfoobarbaz"

hoge.scan(/(ba)(.)/){|s| p s }

=> ["ba", "r"]
   ["ba", "z"]
   ["ba", "r"]
   ["ba", "z"]

さいごに

問題をやろうかと思いましたが、なんか簡単なものしか思いつかなかったのでやめました

よくテレビなんかで「歌詞に"BABY"が最も入っている曲第一位は」とかやってますよね
小さい頃は「数えるの大変やったんやろうなー」なんて思っていましたが、これを使えばそんな心配は全くないですね

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
0