読者です 読者をやめる 読者になる 読者になる

Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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

ruby

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

"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/] => 他の正規表現と混ぜて使わなければならない

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