2009-09-16 16 views

Odpowiedz

21

nazywamy te "wiodące" znaków, nie spływu, ponieważ są one na początku, ale regex tego jest bardzo łatwe

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

Działa dokładnie tak, jak to sformułowałeś: starti ng na początku łańcucha, usuń wszystkie 0 i: s.

+1

Niektórzy z nas są po prostu skromnymi studentami regexu, inni to tylko mistrzowie (macie mnie ode mnie). Tak się dzieje, gdy ty TDD o 2200 godzin. Refaktoryzacja jest pozostawiona jako ćwiczenie. – Gutzofter

+1

'" 00:00:23 "' powoduje "23", co wydaje się dziwne. Ale bez obrazy, to jest dokładnie to, o co prosił PO. –

0

EDIT: pO chciała to od początku:

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

lub zobaczyć man strftime więcej opcji formatowania.

EDYCJA: włączenie całej dyskusji, oto zalecane podejście. Usuwa również potrzebę wywoływania w czasie.

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

Dzięki, ale potrzebuję ogólnego sposobu robienia tego. Otrzymuję ciąg znaków przez konwersję z sekund Time.at (seconds.to_i) .gmtime.strftime ('% R:% S') –

+0

Zamknij! Muszę wymyślić, jak użyć "gsub" z pewnym wyrażeniem regularnym, aby usunąć początkowe zera i/lub dwukropki. –

2

można użyć coś jak Piotr powiedział, ale właściwie to:

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

Innym rozwiązaniem byłoby użyć metody podziału:

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

Chociaż uważam, że jeden więcej mylące i złożone.

0

Możesz chcieć wypróbować pozytywne wyrażenie za regex. Nicea 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" 

koniec

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 

koniec

+0

Nie ma potrzeby używania czterech różnych wyrażeń regularnych i 15 linii kodu! Pojedynczy .sub (/^[0:] * /, "") działa dobrze! –

0

Wiele razy można po prostu polegać na podstawowych technikach konwersji, na przykład w rubinach, jeśli masz ciąg znaków taki jak "05" i chcesz mieć tylko 5, po prostu wykonaj "05" .to_i

Powiązane problemy