Bir dizenin Ruby'de başka bir dizeyle başlayıp başlamadığını nasıl bulabilirim?


Yanıtlar:


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

Bu sorudan önce bilmediğim bir şey: start_withbirden fazla argüman alıyor.

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

1
MRI 1.8.7'de yoktur start_with?, ancak MRI 1.9'da olduğu gibi Rails de vardır.
Wayne Conrad

@Wayne Conrad: Garip, 1.8.7 yapar belgelerine sahip String#start_with?.
Jörg W Mittag

@ Jörg W Mittag, belki garip değil, yanılmışım. MRG 1.8.7 gerçekten de var start_with?. Sanırım denemek için irb yüklediğimde yazdım.
Wayne Conrad

7
İlginç bir şekilde, raylar grammaticaly doğru tanımlayan starts_with?yukarıda 1.8.7 ve sadece diğer adı olan, start_with?.
Mark Thomas

56

Burada sunulan birkaç yöntem olduğu için hangisinin en hızlı olduğunu bulmak istedim. Ruby 1.9.3p362'yi kullanma:

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

Öyle görünüyor start_with?ki en hızlı grup ist.

Ruby 2.2.2p95 ve daha yeni bir makine ile güncellenmiş sonuçlar:

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
normal ifadeler için derleme ve test verilen şaşırtıcı değil sadece bayt karşılaştırma sonra çok daha zor
akostadinov

1
Test dizesi için vakaların tüm permütasyonlarını önceden hesaplamış olsanız bile, Regex'in büyük / küçük harfe duyarlı olmayan aramalar için çok daha üstün olduğuna dikkat edilmelidir.
Peter P.

3
@PeterP. Ben büyük / küçük harfe duyarsız aramaları test ettim ve start_with? Sadece arama dizesini downcase ve ardından küçük arama dizesi ile karşılaştırdığımızda hala önde çıkıyor: "FooBar".downcase.start_with?("foo").
haslo

4

Steenslag tarafından belirtilen yöntem kesiktir ve sorunun kapsamı doğru cevap olarak düşünülmelidir. Bununla birlikte, bunun Ruby'de zaten aşina değilseniz, öğrenmek için önemli bir beceri olan düzenli bir ifade ile elde edilebileceğini bilmeye değer.

Rubular ile bir oyun oynayın: http://rubular.com/

Ancak bu durumda, soldaki dize 'abc' ile başlarsa aşağıdaki ruby ​​deyimi true değerini döndürür. Sağdaki regex değişmezindeki \ A, 'dizenin başlangıcı' anlamına gelir. Rubular ile bir oyun oynayın - işlerin nasıl çalıştığı netleşecek.

'abcdefg' =~  /\Aabc/ 

Wayne Conrad tarafından belirtildiği gibi, bu yöntem start_with'den daha geniş bir çalışma süresi üzerinde de çalışacaktır.
pakeha

2

severim

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

8
[/\Astr/]Burada kullanmalısın . Normal ifadeniz de eşleşir "another\nstring".
haslo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.