Ruby字符串到数组的转换

时间:2013-01-22 22:28:58

标签: ruby

我有一个URL编码的字符串:

a = "%5B%22552A8619-6ECA-4A95-A798-C1E2CE75BFFF%22%2C%2264c19b5b2d0257ddb382dbd3660de3fd%22%2C%22share%22%5D"

如果我对此字符串进行URL解码,那么它将如下所示:

"[\"552A8619-6ECA-4A95-A798-C1E2CE75BFFF\",\"64c19b5b2d0257ddb382dbd3660de3fd\",\"share\"]"

从这个字符串我想得到这个数组:

["552A8619-6ECA-4A95-A798-C1E2CE75BFFF","64c19b5b2d0257ddb382dbd3660de3fd","share"]

如果没有讨厌的字符串替换怎么做?

4 个答案:

答案 0 :(得分:3)

该字符串是使用JSON编码的数组:

require 'cgi'
require 'json'

a = "%5B%22552A8619-6ECA-4A95-A798-C1E2CE75BFFF%22%2C%2264c19b5b2d0257ddb382dbd3660de3fd%22%2C%22share%22%5D"

JSON[CGI::unescape(a)]

[
    [0] "552A8619-6ECA-4A95-A798-C1E2CE75BFFF",
    [1] "64c19b5b2d0257ddb382dbd3660de3fd",
    [2] "share"
]

JSON[CGI::unescape(a)].last将返回"share",让您回家免费。

CGI::escape用于删除编码,将其转换回“正常”JSON编码数组。

JSON[](AKA JSON.parse)将它从JSON表示法转换回Ruby数组。

答案 1 :(得分:3)

the_given_string.scan(/"(.*?)"/).flatten

答案 2 :(得分:2)

您可以删除字符并拆分或评估它:

"[\"A798-C1E2CE75BFFF\",\"643fd\",\"share\"]".delete('\"[]').split(',')
# => ["A798-C1E2CE75BFFF", "643fd", "share"]

eval "[\"A798-C1E2CE75BFFF\",\"643fd\",\"share\"]"
# => ["A798-C1E2CE75BFFF", "643fd", "share"]

答案 3 :(得分:1)

你可以eval字符串:

require 'cgi'
a = "%5B%22552A8619-6ECA-4A95-A798-C1E2CE75BFFF%22%2C%2264c19b5b2d0257ddb382dbd3660de3fd%22%2C%22share%22%5D"
x = eval( CGI.unescape(a))
p x #["552A8619-6ECA-4A95-A798-C1E2CE75BFFF", "64c19b5b2d0257ddb382dbd3660de3fd", "share"]

但是eval是邪恶的。

您可以使用,您所谓的讨厌的字符串替换

p CGI.unescape(a).gsub(/\A\["|"\]\Z/,'').split(/","/)

或者您可以尝试JSON

require 'cgi'
require 'json'
a = "%5B%22552A8619-6ECA-4A95-A798-C1E2CE75BFFF%22%2C%2264c19b5b2d0257ddb382dbd3660de3fd%22%2C%22share%22%5D"
x = JSON.load( CGI.unescape(a))