如何将简单的混合字符串标记为整数或符号?

时间:2013-01-06 01:41:46

标签: ruby string tokenize

尝试将简单的数学字符串"1 2 3 * + 4 5 - /"转换为整数和/或符号(如[1, 2, 3, :*, :+, 4, 5, :-, :/])。

是否有比这更优雅(和可扩展)的解决方案?

def tokenize s
    arr = s.split(/ /)
    symbols = %w{ + - / * }
    arr.collect! do |c| 
        if symbols.include?(c)
            c.to_sym
        else
            c.to_i
        end
    end
end

3 个答案:

答案 0 :(得分:1)

def tokenize(str)
  str.split.map! { |t| t[/\d/] ? t.to_i : t.to_sym }
end

不是检查令牌是否在一组操作中,而是检查它是否包含数字(对于您的用例)。所以它可以是整数,也可以是操作。

另请注意,Array#collect!Array#map!相同,默认情况下String#split会在空白处拆分。

答案 1 :(得分:0)

怎么样......

h = Hash[*%w{+ - / *}.map { |x| [x, x.to_sym] }.flatten]

然后,

arr.map { |c| h[c] || c.to_i }

所以一起:

def tokenize s
    h = Hash[*%w{+ - / *}.map { |x| [x, x.to_sym] }.flatten]
    s.split.map { |c| h[c] || c.to_i }
end

答案 2 :(得分:0)

def tokenize s
  s.scan(/(\d+)|(\S+)/)
  .map{|num, sym| num && num.to_i || sym.to_sym}
end