查找正则表达式的实例,转换为整数,在同一个地方进行数学运算和替换



我有一个包含台湾日期的长字符串输入。我需要将它们转换为美式符号,并将它们留在输入的相同位置。我已经创建了与输入中的文本匹配的正则表达式,但我找不到将这些匹配转换为整数的方法,进行数学运算(更改年份),然后在旧值所在的完全相同的位置替换新值。

台湾日期以 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。

最新更新