سؤال

مرحبا أنا جديد على Ruby وتعبيرات منتظمة. أحاول استخدام تعبير منتظم لإزالة أي أصفار من الشهر أو اليوم في تاريخ تنسيق مثل "02/02/1980" => "2/2/1980"

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

ما هو الخطأ في هذا التعبير العادي؟

شكرا.

هل كانت مفيدة؟

المحلول

يمكنك ببساطة إزالة 0S في الأجزاء التي تنتهي مع مائل.

تناسبني

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

المخرجات

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

نصائح أخرى

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

\b هو علامة عرض صفر لحدودا كلمة \b0 لا يمكن أن يكون لديك رقم قبل الصفر.

لماذا تهتم مع Regex عندما يمكنك القيام بذلك؟

require "date"

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

يحاول /(?<!\d)0(\d)/

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

المشكلة هي أنها لن تتطابق مع تواريخ صالحة، لذا فإن بديلك سوف يتجه سلاسل صالحة. لإصلاح:

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

إستبدال: ''

أنت تقول أن Ruby رمي خطأ في بناء الجملة، لذلك تكمن مشكلتك قبل أن تصل إلى RegexP. ربما لأنك لا تتصل strftime على أي شيء. يحاول:

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

ثم استبدال الوقت. الآن مع في الوقت الحقيقي، ثم تصحيح regexp الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top