我有一个包含台湾日期的长字符串输入。我需要将它们转换成美国符号并将它们留在输入的相同位置。我创建了与输入中的文本匹配的正则表达式,但我找不到将这些匹配项转换为整数的方法,进行数学运算(更改年份),然后将新值替换到与旧值完全相同的位置.
台湾日期的格式为 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 个索引转换为整数,进行数学运算将其转换为西历,然后将其放回同一个地方(现在跳过移动年份到最后)。我还没有运气,我尝试了很多东西。
非常感谢!
最佳答案
你可以把括号里的数字写成capture分别使用它们的值并使用 gsub
用一个 block 来执行动态替换:
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"
在 block 内,special variables $1
, $2
和$3
指的是对应捕获组匹配的文本,即"107"
, "02"
和 "13"
分别。该 block 的结果成为匹配文本的新值。
还有 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
关于ruby - 找到正则表达式的实例,转换成整数,做数学运算并在同一个地方替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54181648/