从数组构建的字符串中删除引号

时间:2017-04-05 23:11:43

标签: ruby-on-rails ruby

我有这样的用户控制器输入(项目的长度和数量可能会改变):

str = "['honda', 'toyota', 'lexus']"

我想把它转换成数组,但我很难找到最好的方法。 eval()正是我所需要的,但它不是很优雅,在这种情况下很危险,因为它是用户控制器输入。

另一种方式是:

str[1..-2].split(',').collect { |car| car.strip.tr("'", '') }

=> ["honda", "toyota", "lexus"]

但这也不是很优雅。任何更“红宝石”的建议?

2 个答案:

答案 0 :(得分:2)

您可以使用正则表达式:

# match (in a non-greedy way) characters up to a comma or `]`
# capture each word as a group, and don't capture `,` or `]`
str.scan(/'(.+?)'(?:,|\])/).flatten

JSON.parse(但考虑到单引号实际上在技术上不允许使用JSON):

JSON.parse( str.tr("'", '"') )

JSON.parse在性能方面可能比正则表达式有一点优势,但是如果你期望你的用户做单引号转义,那么tr就会搞砸了。在这种情况下,我会坚持使用正则表达式。

答案 1 :(得分:0)

JSON.parse看起来更正确,但这是另一种选择:

function hashcode(obj) {
    var hc = 0;
    var chars = JSON.stringify(obj).replace(/\{|\"|\}|\:|,/g, '');
    var len = chars.length;
    for (var i = 0; i < len; i++) {
        // Bump 7 to larger prime number to increase uniqueness
        hc += (chars.charCodeAt(i) * 7);
    }
    return hc;
}