2009-09-16 19 views

risposta

21

Noi chiamiamo questi personaggi "principali", non finale, dal momento che sono all'inizio, ma l'espressione regolare per questo è molto facile

x.sub(/^[0:]*/,"") 

Che funziona esattamente come lo avete scritto: starti ng all'inizio della stringa, rimuovi tutti gli 0 e: s.

+1

Alcuni di noi sono solo umili studenti della regex, altri sono solo padroni (tu hai preso una decisione da me). Questo è quello che succede quando si TDD alle 22:00. Il refactoring è lasciato come esercizio. – Gutzofter

+1

'" 00:00:23 "' risulta in '" 23 "' che sembra strano. Ma senza offesa, questo è ancora esattamente ciò che l'OP ha richiesto. –

0

EDIT: il PO ha voluto questo fin dal principio:

seconds = 11*60+40 
Time.at(seconds.to_i).gmtime.strftime('%M:%S') # gives '11:40' 

o vedere man strftime per ulteriori opzioni di formattazione.

EDIT: integrando tutta la discussione, ecco l'approccio consigliato. Rimuove anche la necessità della chiamata Time.

seconds = seconds.to_i 
if seconds >= 60 
    "#{seconds/60}:#{seconds%60}" 
else 
    "#{seconds}" 
end 
+0

Grazie, ma ho bisogno di un modo generale per farlo. Ottengo la stringa attraverso una conversione da secondi Time.at (seconds.to_i) .gmtime.strftime ('% R:% S') –

+0

Chiudi! Ho bisogno di capire come usare "gsub" con un po 'di regex per togliere gli zeri iniziali e/oi due punti –

2

si può usare qualcosa come Pietro ha detto, ma sarebbe corretto essere:

s = "00:11:40" 
s = s[3..-1] # 11:40 

Un altro approccio sarebbe quello di utilizzare il metodo split:

s = "00:11:40".split(":")[1,2].join(":") 

Anche se trovo che un altro confuso e complesso.

0

Si potrebbe desiderare di provare regex di look-behind positivo. Nizza reference

it "should look-behind for zeros" do 
time = remove_behind_zeroes("ta:da:na") 
time.should be_nil 

time = remove_behind_zeroes("22:43:20") 
time.should == "22:43:20" 

time = remove_behind_zeroes("00:12:30") 
time.should == "12:30" 

time = remove_behind_zeroes("00:11:40") 
time.should == "11:40" 

time = remove_behind_zeroes("00:02:40") 
time.should == "2:40" 

time = remove_behind_zeroes("00:00:26") 
time.should == "26" 

fine

def remove_behind_zeroes(value) 
exp = /(?<=00:00:)\d\d/ 
match = exp.match(value) 
if match then return match[0] end 

exp = /(?<=00:0)\d:\d\d/ 
match = exp.match(value) 
if match then return match[0] end 

exp = /(?<=00:)\d\d:\d\d/ 
match = exp.match(value) 
if match then return match[0] end 

exp = /\d\d:\d\d:\d\d/ 
match = exp.match(value) 
if match then return match[0] end 
nil 

fine

+0

Non c'è bisogno di quattro espressioni regex e 15 linee di codice diverse per fare questo! Un singolo .sub (/^[0:] * /, "") funziona bene! –

0

Molte volte è sufficiente affidarsi a tecniche di conversione di base, ad esempio in rubino, se si avesse una stringa come "05" e si desidera che fosse solo 5, si farebbe semplicemente "05" .to_i

Problemi correlati