Come faccio a sapere se una stringa inizia con un'altra stringa in Ruby?


Risposte:


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

[modifica] Questo è qualcosa che non conoscevo prima di questa domanda: start_withaccetta più argomenti.

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

1
La risonanza magnetica 1.8.7 non ha start_with?, ma la risonanza magnetica 1.9, così come Rails.
Wayne Conrad,

@Wayne Conrad: Stranamente, 1.8.7 fa avere la documentazione per String#start_with?.
Jörg W Mittag,

@ Jörg W Mittag, forse non stranamente, mi sbagliavo. La risonanza magnetica 1.8.7 ha effettivamente start_with?. Immagino di averlo scritto in modo errato quando ho caricato irb per provarlo.
Wayne Conrad,

7
È interessante notare che Rails definisce grammaticalmente corretto starts_with?, che in 1.8.7 e versioni successive è solo alias start_with?.
Mark Thomas,

56

Dato che ci sono molti metodi qui presentati, ho voluto capire quale fosse il più veloce. Utilizzando 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

Quindi sembra che sia start_with?il più veloce del gruppo.

Risultati aggiornati con Ruby 2.2.2p95 e una macchina più recente:

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
non sorprende se compilare e testare espressioni regolari è molto più difficile che semplicemente confrontare i byte
akostadinov

1
Va notato che Regex è di gran lunga superiore per le ricerche senza distinzione tra maiuscole e minuscole, anche se in anticipo sono state calcolate tutte le permutazioni dei casi per la stringa di test.
Peter P.

3
@PeterP. Ho appena testato le ricerche senza distinzione tra maiuscole e minuscole e start_with? ancora viene fuori in anticipo se si appena downcase la stringa da cercare e poi confrontare con la stringa di ricerca in minuscolo: "FooBar".downcase.start_with?("foo").
haslo,

4

Il metodo citato da steenslag è conciso e, considerato lo scopo della domanda, dovrebbe essere considerata la risposta corretta. Tuttavia, vale anche la pena sapere che questo può essere ottenuto con un'espressione regolare, che se non si ha già familiarità con Ruby, è un'abilità importante da imparare.

Divertiti con Rubular: http://rubular.com/

Ma in questo caso, la seguente istruzione ruby ​​restituirà vero se la stringa a sinistra inizia con 'abc'. Il carattere \ A nel regex letterale a destra significa "l'inizio della stringa". Gioca con Rubular - diventerà chiaro come funzionano le cose.

'abcdefg' =~  /\Aabc/ 

Come sottolineato da Wayne Conrad, questo metodo funzionerà anche su una più ampia gamma di runtime rispetto a start_with.
Pakeha,

2

mi piace

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

8
Dovresti usare [/\Astr/]qui. Anche la tua regex corrisponde "another\nstring".
Halo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.