Question

Salut je suis nouveau à Ruby et des expressions régulières. Je suis en train d'utiliser une expression régulière pour éliminer les zéros du mois ou le jour à une date formatée comme « 02/02/1980 » => « 02/02/1980 »

def m_d_y
  strftime('%m/%d/%Y').gsub(/0?(\d{1})\/0?(\d{1})\//, $1 + "/" + $2 + "/" )
end

Quel est le problème avec cette expression régulière?

Merci.

Était-ce utile?

La solution

Vous pouvez simplement supprimer 0s dans les parties qui se termine par une barre oblique.

Travaux pour moi

require "date"

class Date
    def m_d_y
      strftime('%m/%d/%Y').gsub(/0(\d)\//, "\\1/")
    end
end

puts Date.civil(1980, 1, 1).m_d_y
puts Date.civil(1980, 10, 1).m_d_y
puts Date.civil(1980, 1, 10).m_d_y
puts Date.civil(1908, 1, 1).m_d_y
puts Date.civil(1908, 10, 1).m_d_y
puts Date.civil(1908, 1, 10).m_d_y

sorties

1/1/1980
10/1/1980
1/10/1980
1/1/1908
10/1/1908
1/10/1908

Autres conseils

"02/02/1980".gsub(/\b0/, '') #=> "2/2/1980"

\b est un marqueur de longueur nulle pour une limite de mot, donc \b0 ne peut pas avoir un chiffre avant le zéro.

Pourquoi prendre la peine avec regex quand vous pouvez le faire?

require "date"

class Date
    def m_d_y
      [mon, mday, year].join("/")
    end
end

Essayez /(?<!\d)0(\d)/

"02/02/1980".gsub(/(?<!\d)0(\d)/,$1)
=> "2/2/1980"

Le problème est qu'il ne correspond pas à des dates valides afin que votre remplacement mutiler les chaînes valides. Pour résoudre:

Regex: (^|(?<=/))0

Remplacement: ''

Vous dites que Ruby est de lancer une erreur de syntaxe, de sorte que votre problème est avant même d'avoir atteint le regexp. Probablement parce que vous n'êtes pas appeler strftime sur quoi que ce soit. Essayez:

def m_d_y
  t = Time.now
  t.strftime('%m/%d/%Y').gsub(/0?(\d{1})\/0?(\d{1})\//, $1 + "/" + $2 + "/" )
end

Remplacez ensuite Time.now avec un temps réel, puis déboguer votre expression rationnelle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top