Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

String#[substr]でパターンに一致する場合そのパターンを返す

一致していれば文字列を返し

"hoge fuga"['hoge']
#=> "hoge"

一致しなければ、nilを返します

"hoge fuga"['foo']
#=> nil

つかいどころと性能比較

require 'benchmark/ips'

Benchmark.ips do |x|
 x.report("['substr']") { "hoge fuga"["fuga"]}
 x.report("[/substr/]") { "hoge fuga"[/fuga/]}
 x.report("include?") { "hoge fuga".include?("fuga")}
 x.compare!
end

Calculating -------------------------------------
['substr'] 87.631k i/100ms
[/substr/] 78.634k i/100ms
include? 98.013k i/100ms

                                                                                                • -

['substr'] 2.477M (± 7.2%) i/s - 12.356M
[/substr/] 1.860M (± 5.6%) i/s - 9.279M
include? 2.905M (± 6.4%) i/s - 14.506M

Comparison:
include?: 2904552.8 i/s
['substr']: 2477433.8 i/s - 1.17x slower
[/substr/]: 1860109.6 i/s - 1.56x slower

正規表現は見るからに遅いですね……。

というわけで、これら機能は

  • String#include? => とりあえず一致するかだけ知りたい
  • String#[substr] => 一致した文字を使って継続した処理を行いたい
  • String#[/regex/] => 他の正規表現と混ぜて使わなければならない

といった感じで使い分けるのが良いかと思われます。