繁体   English   中英

使用正则表达式将字符串替换为特定格式-Ruby

[英]replace a string with a specfic format using regex - Ruby

这是我的下面的代码。 我有大约100个文本文件,我想替换特定格式的许多字符串,其中包括与哈希图中的键对应的值。

如果您看下面的代码,就可以理解这种情况。

require 'yaml'

map = YAML.load(File.open("/Documents/final.yml"))

Dir.glob('/Documents/**/*.txt') do |item|
   next if item == '.' or item == '..'
contents = File.read(item)
newFile = File.open(item, "w")
contents  = contents.gsub(/My data\(@"([^"]+)",([^,]+),([^,]+),([^,]+)\)/) {'Your data(@'+ $1 +','+ $2 +',' + $3 + ',' + map[$1] + ',' + $4 + ')'}
newFile.write(contents)
end

由于某种原因,我得到如下错误[test2.rb是我的ruby脚本文件]

test2.rb:9:in `+': no implicit conversion of nil into String (TypeError)
from test2.rb:9:in `block (2 levels) in <main>'
from test2.rb:9:in `gsub'
from test2.rb:9:in `block in <main>'
from test2.rb:5:in `glob'
from test2.rb:5:in `<main>'

如果我从代码中删除map [$ 1],我将正确获得输出。

contents  = contents.gsub(/My data\(@"([^"]+)",([^,]+),([^,]+),([^,]+)\)/) {'Your data(@'+ $1 +','+ $2 +',' + $3 + ',' + $4 + ')'}

另外,如果我删除其他字符串并且只有map [$ 1],我仍然会得到预期的输出。

contents  = contents.gsub(/My data\(@"([^"]+)",([^,]+),([^,]+),([^,]+)\)/) { map[$1] }

但是在一起却不起作用。

任何帮助将不胜感激

为了扩展@NeilSlater的答案,这将是一种可能的干净解决方案:

contents.gsub(/My data\(@"([^"]+)",([^,]+),([^,]+),([^,]+)\)/) do
  values = [$1, $2, $3, map[$1], $4].join(',')
  "Your data(@#{values})"
end

在这种情况下, join将隐式调用数组内容中的to_s 但是,这意味着,如果在map找不到值,则最终将得到一个空值,例如

您的数据(@ 123,a,b ,, c)

如果您想忽略它,请在加入数组之前在数组上调用compact ,最后得到

您的数据(@ 123,a,b,c)

对于其中一个文件中的至少一个条目, map[$1]值为nil 它可以单独存储在数组中,并根据需要输出。 使用+串联时,将导致您看到的错误。

您可以改为使用map[$1].to_s强制转换为String。 对于nil它将返回空字符串"" ,这可能是您想要的。

您还可以使用Ruby的内置字符串插值法,该方法在内部做相同的事情,并且与您的用法非常匹配.gsub之后的.gsub块可以是{ "Your data(@#{$1},#{$2},#{$3},#{map[$1]},#{$4})" }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM