it-swarm.com.de

Wie finde ich heraus, ob eine Zeichenfolge mit einer anderen Zeichenfolge in Ruby beginnt?

Was ist der beste Weg, um herauszufinden, ob eine Zeichenkette mit einer anderen in Ruby (ohne Rails) beginnt?

142
Guillaume Coté
puts 'abcdefg'.start_with?('abc')  #=> true

[edit] Das ist etwas, was ich vor dieser Frage nicht wusste: start_with akzeptiert mehrere Argumente.

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

Da hier mehrere Methoden vorgestellt werden, wollte ich herausfinden, welche am schnellsten ist. Verwenden von 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

So sieht es aus wie start_with? ist der schnellste von allen.

Aktualisierte Ergebnisse mit Ruby 2.2.2p95 und einem neueren Computer:

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)
53
haslo

Die von steenslag erwähnte Methode ist knapp und sollte in Anbetracht des Umfangs der Frage als die richtige Antwort betrachtet werden. Es ist jedoch auch wichtig zu wissen, dass dies mit einem regulären Ausdruck erreicht werden kann. Wenn Sie mit Ruby noch nicht vertraut sind, ist dies eine wichtige Fähigkeit, die Sie erlernen müssen.

Spielen Sie mit Rubular: http://rubular.com/

In diesem Fall gibt die folgende Ruby Anweisung true zurück, wenn der String links mit 'abc' beginnt. Das\A im Regex-Literal rechts bedeutet 'der Anfang des Strings Spielen Sie mit Rubular - es wird klar, wie die Dinge funktionieren.

'abcdefg' =~  /\Aabc/ 
4
pakeha

Ich mag

if ('string'[/^str/]) ...
2
the Tin Man