ruby - 找到正则表达式的实例,转换成整数,做数学运算并在同一个地方替换?

标签 ruby regex integer

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

台湾日期的格式为 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/

相关文章:

ruby-on-rails - Rails 4.2 - 为什么assert_select 失败?

ruby - 如何搜索单个节点,而不是所有节点

ruby - 使用 SimpleForm 上传 CarrierWave;为什么 "remote_image_url"和 "image"保存到同一数据库列?

javascript - 使用 RegExp 转换 JSON 键值

java - 如何设置一个长整数的SeekBar进度? (或替代品)

ruby-on-rails - RoR : named_scope, 最近 7 天内创建的所有记录?

regex - 将任何非数字转换为空白

regex - MVC4 Razr 在 AngularJS 电子邮件正则表达式模式上抛出错误

c++ - 堆栈与整数

integer - 为什么MyBatis countByExample默认的resultType是java.lang.Long