红宝石中的字符串替换

时间:2013-11-23 18:48:10

标签: ruby

我有一个字符串,括号内有形式 args,数组中有实际的args。在下面的表达式中,我需要用实际的args替换形式。在Ruby中寻找干净利落的选择..

string = "[m,n] { m + n * 8  + aa }"
array = [12, false]
output = "{ 12 + false * 8 + aa }"

2 个答案:

答案 0 :(得分:3)

def convert( expression, *input_values )
  params = /^\[([^\]]+)\]\s*/
  keys   = expression[params,1].split(',')
  map    = Hash[ keys.zip(input_values) ]
  key_re = /\b(?:#{keys.join('|')})\b/

  expression.sub(params,'').gsub(key_re){ |key| map[key] }
end

p convert( "[m,n] { m + n * 8  + aa }", 12, false )
#=> "{ 12 + false * 8  + aa }"

这是如何运作的:

  1. 取表达式并在其中找到名称;称之为keys
  2. 创建一个哈希,将键名映射到传入的值,例如{"m"=>12, "n"=>false}
  3. 创建一个单一的正则表达式,将所有键作为自己的单词查找,例如: /\b(?:m|n)\b/
    • 这样,以后不会意外地替换一次替换中的字符串值。
  4. 从输入表达式中删除形式参数,然后
  5. 找到密钥正则表达式,并为每个找到的值替换为散列值。

答案 1 :(得分:0)

如果你的最终目标是使用提供的参数来评估字符串,你可以这样做:

aa = 7
args = [12, 6]
str = "[m,n] { m + n * 8 + aa }"

proc_str = "-> " + str.sub("[","(").sub("]",")") # "-> (m,n) { m + n * 8 + aa }"
eval(proc_str).call(*args) # => 67