Pergunta

Olá, sou novo em Ruby e expressões regulares. Estou tentando usar uma expressão regular para remover qualquer zeros do mês ou dia em uma data formatada como "02/02/1980" => "2/2/1980"

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

O que há de errado com esta expressão regular?

Obrigado.

Foi útil?

Solução

Você pode simplesmente remover 0s em partes que termina com uma barra.

Funciona para mim

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

saídas

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

Outras dicas

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

\b é um marcador de largura zero para um limite de palavra, portanto \b0 não pode ter um dígito antes do zero.

Por que se preocupar com Regex quando você pode fazer isso?

require "date"

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

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

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

O problema é que ele não corresponde às datas válidas, para que sua substituição gerencie seqüências válidas. Consertar:

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

Substituição: ''

Você diz que Ruby está lançando um erro de sintaxe, então seu problema está antes mesmo de chegar ao Regexp. Provavelmente porque você não está ligando strftime em qualquer coisa. Tentar:

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

Em seguida, substitua o tempo. Agora com um tempo real e depure seu regexp.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top