2009-09-16 16 views

Respuesta

21

Llamamos a estos personajes "principales", no se arrastra, ya que son al principio, pero la expresión regular para esto es muy fácil

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

Eso funciona exactamente como usted lo expresó: starti ng al comienzo de la cadena, elimine todos los 0 y: s.

+1

Algunos de nosotros somos solo estudiantes humildes de la expresión regular, otros solo son maestros (ya has aprendido de mí). Eso es lo que sucede cuando tienes TDD a las 22:00 h. La refactorización se deja como un ejercicio. – Gutzofter

+1

'" 00:00:23 "' da como resultado '" 23 "' que parece extraño. Pero sin ofender, esto sigue siendo exactamente lo que solicitó el OP. –

0

EDIT: el PO quería esto desde el principio:

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

o ver man strftime para más opciones de formato.

EDIT: incorporando toda la discusión, este es el enfoque recomendado. Elimina la necesidad de la llamada de tiempo también.

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

Gracias, pero necesito una forma general de hacerlo. Obtengo la cadena a través de una conversión de segundos Time.at (seconds.to_i) .gmtime.strftime ('% R:% S') –

+0

¡Cierre! Necesito calcular cómo usar "gsub" con algunas expresiones regulares para quitar los ceros iniciales y/o los dos puntos –

2

se puede usar algo como Pedro dijo, pero podría correctamente ser:

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

Otro enfoque sería utilizar el método split:

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

Aunque me parece que uno más confuso y complejo.

0

Es posible que desee probar la expresión positiva positiva detrás de la expresión regular. Niza 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" 

final

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 

final

+0

¡No hace falta cuatro expresiones regulares diferentes y 15 líneas de código para hacer esto! Un solo .sub (/^[0:] * /, "" funciona bien! –

0

Muchas veces puedes simplemente confiar en las técnicas básicas de conversión, en ruby, por ejemplo, si tienes una cadena como "05" y quieres que sea solo 5, simplemente harías "05" .to_i

Cuestiones relacionadas