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)を:aifに置き換えnumeric?ますfalse。このためには、to_sym()メソッドを使用する必要があります。

numeric?()これを行うにはもっと速い方法があるかもしれませんが、ブール関数はかなりハンサムだと思います。

于 2012-12-05T09:30:22.973 に答える