Rubino espressione regolare utilizzando gsub
Domanda
Ciao io sono nuovo a Ruby e le espressioni regolari. Sto cercando di usare un'espressione regolare per rimuovere eventuali zeri dal mese o il giorno in una data formattata come "1980/02/02" => "1980/02/02"
def m_d_y
strftime('%m/%d/%Y').gsub(/0?(\d{1})\/0?(\d{1})\//, $1 + "/" + $2 + "/" )
end
Cosa c'è di sbagliato con questa espressione regolare?
Grazie.
Soluzione
È possibile rimuovere semplicemente 0s in parti che termina con una barra.
Lavora per me
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
uscite
1/1/1980
10/1/1980
1/10/1980
1/1/1908
10/1/1908
1/10/1908
Altri suggerimenti
"02/02/1980".gsub(/\b0/, '') #=> "2/2/1980"
\b
è un indicatore di ampiezza zero per un confine di parola, quindi \b0
non può avere una cifra prima lo zero.
Perché perdere tempo con espressioni regolari quando si può fare questo?
require "date"
class Date
def m_d_y
[mon, mday, year].join("/")
end
end
Prova /(?<!\d)0(\d)/
"02/02/1980".gsub(/(?<!\d)0(\d)/,$1)
=> "2/2/1980"
Il problema è che non corrisponderà date valide in modo che il ricambio storpiare stringhe valide. Per risolvere il problema:
Regex: (^|(?<=/))0
Replacement: ''
Tu dici che Ruby sta gettando un errore di sintassi, in modo che il problema risiede prima di aver ancora raggiunto l'espressione regolare. Probabilmente perché non sta chiamando strftime
su nulla. Prova:
def m_d_y
t = Time.now
t.strftime('%m/%d/%Y').gsub(/0?(\d{1})\/0?(\d{1})\//, $1 + "/" + $2 + "/" )
end
Quindi sostituire Time.now con un tempo reale, quindi eseguire il debug regexp.