Rubyで文字列が別の文字列で始まるかどうかを確認するにはどうすればよいですか?


回答:


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

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

'abcdefg'.start_with?( 'xyz', 'opq', 'ab')

1
MRI 1.8.7にははありませんがstart_with?、MRI 1.9にはRailsと同様にあります。
ウェインコンラッド

@Wayne Conrad:不思議なことに、1.8.7にのドキュメントがありString#start_with?ます。
イェルクWミッターク

@JörgW Mittag、おそらく奇妙なことではないが、私は間違っていた。MRI 1.8.7は確かに持っていstart_with?ます。私はそれを試すためにirbをロードしたときにそれをタイプミスしたと思います。
ウェインコンラッド

7
興味深いことに、Railsは文法的に正しいを定義しますstarts_with?。これは1.8.7以降では単ににエイリアスされていstart_with?ます。
マークトーマス

56

ここではいくつかの方法が提示されているので、どれが最も高速かを調べたかったのです。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)

4
驚くべきことではない与えられ、単にバイトを比較するはるかに困難さのコンパイルと正規表現をテスト
akostadinov

1
事前にテスト文字列のケースのすべての順列を計算した場合でも、Regexは大文字と小文字を区別しない検索に対してはるかに優れていることに注意してください。
Peter P.

3
@PeterP。大文字と小文字を区別しない検索をテストしたところ、start_with?検索する文字列を単に小文字にして、小文字の検索文字列と比較した場合でも、次のようになります"FooBar".downcase.start_with?("foo")
haslo 2016年

4

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

Rubularで遊びましょう:http ://rubular.com/

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

'abcdefg' =~  /\Aabc/ 

Wayne Conradが指摘したように、このメソッドはstart_withよりも幅広いランタイムで機能します。
pakeha 2010年

2

好き

if ('string'[/^str/]) ...

8
[/\Astr/]ここで使用する必要があります。あなたの正規表現も一致し"another\nstring"ます。
haslo 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.