2009-09-16 7 views

Répondre

21

Nous appelons ces « grands » personnages, pas de fuite, car ils sont au début, mais l'expression rationnelle pour ce qui est très facile

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

Cela fonctionne exactement comme vous l'avez formulé: starti ng au début de la chaîne, supprimez tous les 0 et: s.

+1

Certains d'entre nous ne sont que des humbles élèves de la regex, d'autres ne sont que des maîtres (vous en avez un de plus). C'est ce qui arrive quand vous TDD à 2200 heures. Refactoring est laissé comme un exercice. – Gutzofter

+1

'" 00:00:23 "' a pour résultat '" 23 "' ce qui semble étrange. Mais pas d'offense, c'est toujours exactement ce que l'OP a demandé. –

0

EDIT: l'OP voulait dès le commencement:

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

ou voir man strftime pour plus d'options de formatage.

EDIT: en intégrant toute la discussion, voici l'approche recommandée. Il supprime également le besoin de l'appel de temps.

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

Merci, mais j'ai besoin d'une manière générale de le faire. Je reçois la chaîne à travers une conversion de secondes Time.at (seconds.to_i) .gmtime.strftime ('% R:% S') –

+0

Fermer! J'ai besoin de comprendre comment utiliser "gsub" avec certains regex pour enlever les zéros et/ou les deux-points. –

2

Vous pouvez utiliser quelque chose comme dit Peter, mais serait bien être:

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

Une autre approche serait d'utiliser la méthode du partage:

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

Bien que je trouve que l'un plus confus et complexe.

0

Vous pouvez essayer l'expression rationnelle positive. Belle 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" 

fin

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 

fin

+0

Pas besoin de quatre expressions rationnelles différentes et 15 lignes de code pour le faire! Un seul .sub (/^[0:] * /, "") fonctionne bien! –

0

Beaucoup de fois vous pouvez simplement compter sur des techniques de base de conversion, dans ruby ​​par exemple, si vous aviez une chaîne comme "05" et que vous vouliez juste être 5, vous feriez simplement "05" .to_i

Questions connexes