我有一个包含台湾日期的长字符串输入。我需要将它们转换为美式符号,并将它们留在输入的相同位置。我已经创建了与输入中的文本匹配的正则表达式,但我找不到将这些匹配转换为整数的方法,进行数学运算(更改年份),然后在旧值所在的完全相同的位置替换新值。
台湾日期以 yyy/mm/dd 的形式形成。
例如:107年02月13日
,即02/13/2018
到目前为止,我有:
input = gets
texto = input.gsub(/s+/, "")
Date_with_characters = /d{3}年d{2}月d{2}日/
if input.match(Date_with_characters)
puts "Encuentro fechas con caracteres"
elsif
puts "NO encuentro un joraca con caracteres"
end
Date_with_slashes = %r{d{3}/d{2}/d{2}}
if input.match(Date_with_slashes)
puts "Encuentro fechas con barras"
elsif
puts "NO encuentro un joraca con barras"
end
上面的代码可以找到所有日期(包括字符和斜杠),但我希望我能将一年中的前 3 个索引转换为整数,进行数学运算将其转换为西方日历,然后将其放回原处(暂时跳过将年份移动到末尾)。我还没有运气,我尝试了很多东西。
多谢!
数字放在括号中以分别捕获其值,并将gsub
与块一起使用以执行动态替换:
str = 'foo 107年02月13日 bar'
str.gsub(/(d{3})年(d{2})月(d{2})日/) { "#{$2}/#{$3}/#{$1.to_i + 1911}" }
#=> "foo 02/13/2018 bar"
在块中,特殊变量$1
、$2
和$3
引用与相应捕获组匹配的文本,即 "107"
、"02"
和"13"
。块的结果将成为匹配文本的新值。
还有gsub!
(带有!
),它就地执行替换(即它修改接收器),如果没有找到匹配项,则返回nil
。如果要根据是否发生替换提供消息,这会很有用:
if input.gsub!(/(d{3})年(d{2})月(d{2})日/) { "#{$2}/#{$3}/#{$1.to_i + 1911}" }
puts 'dates have been converted'
else
puts 'no dates could be found'
end
这是一种确认日期有效的方法。后者本质上是我所采取的方法的免费赠品。
require 'date'
def convert_date(str)
str.gsub(/d{3}年d{2}月d{2}日/) do |s|
dt = DateTime.strptime(s, '%Y年%m月%d日') rescue nil
(raise ArgumentError, "#{s} is not a valid date") if dt.nil?
"#{dt.month}/#{dt.day}/#{dt.year.to_i + 1911}"
end
end
convert_date 'foo 107年02月13日 bar and 106年11月25日 baz'
#=> "foo 2/13/2018 bar and 11/25/2017 baz"
convert_date 'foo 107年02月13日 bar and 106年02月29日 baz'
#=> ArgumentError (106年02月29日 is not a valid date)
请参阅 DateTime::strptime 和 Kernel#raise。