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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top