はじめに
今回は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"が最も入っている曲第一位は」とかやってますよね
小さい頃は「数えるの大変やったんやろうなー」なんて思っていましたが、これを使えばそんな心配は全くないですね