替换字符串Ruby中的字符

时间:2014-06-21 23:05:44

标签: ruby command-line sed

我有以下字符串,其中包含数组元素,我想将数组元素中的引号删除到数组外部:

"date":"2014-05-04","name":"John","products":["12","14","45"],"status":"completed"

有没有办法删除[]中的双引号并在[]的开头和结尾添加双引号?结果:

"date":"2014-05-04","name":"John","products":"[12,14,45]","status":"completed"

可以在ruby中完成,还是可以使用命令行?

3 个答案:

答案 0 :(得分:2)

你的字符串对我来说就像是一个json哈希:

json = '{"date":"2014-05-04","name":"John","products":["12","14","45"],"status":"completed"}'

require 'json'

hash = JSON.load(json)
hash.update('products' => hash['products'].map(&:to_i))

puts hash.to_json
# => {"date":"2014-05-04","name":"John","products":[12,14,45],"status":"completed"}

或者如果你真的想让数组表示为字符串(不再是json):

hash.update('products' => hash['products'].map(&:to_i).to_s) # note .to_s here

puts hash.to_json
# => {"date":"2014-05-04","name":"John","products":"[12,14,45]","status":"completed"}

答案 1 :(得分:0)

@spickermann的回答非常好,这是我能想到的最好的方式,但是因为我很乐意尝试在不使用json的情况下找到替代方案,所以这里有:

def string_to_result(str)
  str.match(/(?:\[)((?:")+(.)+(?:")+)+(?:\])/)
  str.gsub($1, "#{$1.split(',').map{ |num| num.gsub('"', '') }.join(',')}").gsub(/\[/, '"[').gsub(/\]/, ']"').gsub(/String/, 'Results')
end

丑陋如同地狱,但它有效:P 我尝试了一步,但这对我的正则表达式技能来说更难。

无论如何,你不应该只使用regexp解析结构化的东西,比如json或xml,这只是为了好玩。

[编辑]如果括号旁边的引号有误,抱歉。固定。 还有,还有一件事,这就失败了!字符串中其他位置的空数组或数组只是少数会失败的情况。

答案 2 :(得分:0)

你可以使用String#gsub的形式:

str = '"2014-05-04","name":"John","products":["12","14","45"],"status":"completed"'

puts str.gsub(/\["(\d+)","(\d+)","(\d+)"\]/) { "\"[#{$1},#{$2},#{$3}]\"" }
  #"2014-05-04","name":"John","products":"[12,14,45]","status":"completed"