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

Antworten:

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

[bearbeiten] Dies ist etwas, was ich vor dieser Frage nicht wusste: start_withnimmt mehrere Argumente.

'abcdefg'.start_with?( 'xyz', 'opq', 'ab')
steenslag
quelle
1
MRT 1.8.7 hat nicht start_with?, MRT 1.9 ebenso wie Rails.
Wayne Conrad
@Wayne Conrad: Merkwürdigerweise 1.8.7 hat für die Dokumentation haben String#start_with?.
Jörg W Mittag
@ Jörg W Mittag, vielleicht nicht seltsam, ich habe mich geirrt. MRT 1.8.7 hat in der Tat start_with?. Ich glaube, ich habe es getippt, als ich irb geladen habe, um es zu versuchen.
Wayne Conrad
7
Interessanterweise definiert Rails die korrekte Grammatik starts_with?, auf die in Version 1.8.7 und höher nur ein Alias ​​festgelegt ist start_with?.
Mark Thomas
56

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

Es sieht also so aus, als wäre es start_with?der schnellste im ganzen Haufen.

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)
haslo
quelle
4
Kein Wunder, wenn
1
Es ist zu beachten, dass Regex bei Suchvorgängen ohne Berücksichtigung der Groß- und Kleinschreibung weit überlegen ist, selbst wenn Sie alle Permutationen von Fällen für die Testzeichenfolge im Voraus berechnet haben.
Peter P.
3
@ PeterP. Ich habe gerade die Suche ohne Berücksichtigung der Groß- und Kleinschreibung getestet und start_with? Sie haben immer noch die Nase vorn, wenn Sie die zu suchende Zeichenfolge nur in Kleinbuchstaben schreiben und dann mit der Suchzeichenfolge in Kleinbuchstaben vergleichen : "FooBar".downcase.start_with?("foo").
Haslo
4

Die von steenslag erwähnte Methode ist knapp und sollte angesichts des Umfangs der Frage als die richtige Antwort angesehen 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 jedoch true zurück, wenn die Zeichenfolge links mit 'abc' beginnt. Das \ A im Regex-Literal rechts bedeutet "der Anfang der Zeichenfolge". Spielen Sie mit Rubular - es wird klar, wie die Dinge funktionieren.

'abcdefg' =~  /\Aabc/ 
pakeha
quelle
Wie Wayne Conrad hervorhob, funktioniert diese Methode auch mit einer größeren Anzahl von Laufzeiten als start_with.
Pakeha
2

ich mag

if ('string'[/^str/]) ...
der Blechmann
quelle
8
Sie sollten [/\Astr/]hier verwenden. Ihre Regex stimmt auch überein "another\nstring".
Haslo