Ruby regulärer Ausdruck mit GSUB
Frage
Hallo, ich bin neu in Ruby und reguläre Ausdrücke. Ich versuche, einen regulären Ausdruck zu verwenden, um Nullen aus dem Monat oder Tag in einem Datum zu entfernen, das wie "02/02/1980" => "2/2/1980" formatiert ist.
def m_d_y
strftime('%m/%d/%Y').gsub(/0?(\d{1})\/0?(\d{1})\//, $1 + "/" + $2 + "/" )
end
Was ist los mit diesem regulären Ausdruck?
Vielen Dank.
Lösung
Sie können einfach die 0s in Teilen entfernen, die mit einem Schrägstrich endet.
Funktioniert bei mir
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
Ausgänge
1/1/1980
10/1/1980
1/10/1980
1/1/1908
10/1/1908
1/10/1908
Andere Tipps
"02/02/1980".gsub(/\b0/, '') #=> "2/2/1980"
\b
ist daher ein Breitenmarker für eine Wortgrenze \b0
kann vor der Null keine Ziffer haben.
Warum sich mit Regex beschäftigen, wenn Sie das tun können?
require "date"
class Date
def m_d_y
[mon, mday, year].join("/")
end
end
Versuchen /(?<!\d)0(\d)/
"02/02/1980".gsub(/(?<!\d)0(\d)/,$1)
=> "2/2/1980"
Das Problem ist, dass es keine gültigen Daten übereinstimmt, sodass Ihr Ersatz gültige Zeichenfolgen mangiert. Reparieren:
Regex: (^|(?<=/))0
Ersatz: ''
Sie sagen, dass Ruby einen Syntaxfehler wirft, daher liegt Ihr Problem, bevor Sie das Regexp überhaupt erreicht haben. Wahrscheinlich, weil Sie nicht anrufen strftime
auf alles. Versuchen:
def m_d_y
t = Time.now
t.strftime('%m/%d/%Y').gsub(/0?(\d{1})\/0?(\d{1})\//, $1 + "/" + $2 + "/" )
end
Ersetzen Sie dann die Zeit. Now mit einer Echtzeit und debuggen Sie dann Ihren Regexp.