1

我有以下字符串输出:

"[1, 2, 3, *, +, 4, 5, -, /]"

如何符号化非数字字符(即 *、+、-、/)并返回以下结果:

[1, 2, 3, :*, :+, 4, 5, :-, :/]

目前,我正在使用这种方法来转换字符串:

def tokens(str)
    new_str = str.split(/\s+/)
    clean_str = new_str.to_s.gsub(/"/, '')
            #Symbolise clean_str to desired output
end
4

3 回答 3

2
str = "[1, 2, 3, *, +, 4, 5, -, /]"

str.scan(/[^\[\]\s,]+/)
# => ["1", "2", "3", "*", "+", "4", "5", "-", "/"]

str.scan(/[^\[\]\s,]+/).map {|t| Integer(t) rescue t.to_sym }
# => [1, 2, 3, :*, :+, 4, 5, :-, :/]
于 2012-12-05T12:24:59.943 回答
1
eval(str.gsub(/(?<=\[| )(?=\D)/, ":"))
于 2012-12-05T09:52:32.930 回答
0

true如果当前字符串是数字,您可以创建一个布尔方法返回,或者false otherwise。所以基本上,你可以这样做:

class String
  def numeric?
    Float(self) != nil rescue false
  end
end

"3".numeric?
#=> true
"+".numeric?
#=> false
"a".numeric?
#=> false
"-3".numeric?
#=> true

然后,您可以遍历您的列表(通过each()例如)并将当前字符串(例如)替换a:aifnumeric?返回false。为此,您必须使用该to_sym()方法。

可能有更快的方法可以做到这一点,但我认为numeric?()布尔函数非常漂亮。

于 2012-12-05T09:30:22.973 回答