181

Rubyで(レールなしで)文字列が別の文字列で始まっているかどうかを見つける最良の方法は何ですか?

4

4 に答える 4

289
puts 'abcdefg'.start_with?('abc')  #=> true

[編集] これは、この質問の前に私が知らなかったことです:start_with複数の引数を取ります。

'abcdefg'.start_with?( 'xyz', 'opq', 'ab')
于 2010-11-12T20:02:23.160 に答える
61

ここにはいくつかの方法が示されているので、どの方法が最も速いかを調べたいと思いました。Ruby 1.9.3p362 を使用:

irb(main):001:0> require 'benchmark'
=> true
irb(main):002:0> Benchmark.realtime { 1.upto(10000000) { "foobar"[/\Afoo/] }}
=> 12.477248
irb(main):003:0> Benchmark.realtime { 1.upto(10000000) { "foobar" =~ /\Afoo/ }}
=> 9.593959
irb(main):004:0> Benchmark.realtime { 1.upto(10000000) { "foobar"["foo"] }}
=> 9.086909
irb(main):005:0> Benchmark.realtime { 1.upto(10000000) { "foobar".start_with?("foo") }}
=> 6.973697

だから、それstart_with?は束の中で最速のようです。

Ruby 2.2.2p95 以降のマシンで更新された結果:

require 'benchmark'
Benchmark.bm do |x|
  x.report('regex[]')    { 10000000.times { "foobar"[/\Afoo/] }}
  x.report('regex')      { 10000000.times { "foobar" =~ /\Afoo/ }}
  x.report('[]')         { 10000000.times { "foobar"["foo"] }}
  x.report('start_with') { 10000000.times { "foobar".start_with?("foo") }}
end

            user       system     total       real
regex[]     4.020000   0.000000   4.020000 (  4.024469)
regex       3.160000   0.000000   3.160000 (  3.159543)
[]          2.930000   0.000000   2.930000 (  2.931889)
start_with  2.010000   0.000000   2.010000 (  2.008162)
于 2013-01-11T09:55:08.053 に答える
5

steenslag によって言及された方法は簡潔であり、質問の範囲を考えると、それは正しい答えと見なされるべきです。ただし、正規表現を使用してこれを実現できることも知っておく価値があります。これは、Ruby に慣れていない場合は、学ぶべき重要なスキルです。

Rubular で遊んでみよう: http://rubular.com/

ただし、この場合、左側の文字列が「abc」で始まる場合、次の ruby​​ ステートメントは true を返します。右側の正規表現リテラルの \A は、「文字列の先頭」を意味します。rubular で遊んでみてください。物事がどのように機能するかが明らかになります。

'abcdefg' =~  /\Aabc/ 
于 2010-11-12T20:20:39.487 に答える
2

好き

if ('string'[/^str/]) ...
于 2010-11-12T23:19:46.053 に答える