2013-11-23 138 views
0

我有了括號內正式指定參數和陣列中的實際ARGS的字符串。在下面的表達式中,我需要用實際參數來替換形式。尋找在Ruby中的選項來做到這一點乾淨..字符串替換紅寶石

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

生紅寶石,沒有乾淨。不知道樹頂等是否是正確的解決方案,可能比我需要的更多。 – Fanatic23

回答

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. 找到鑰匙正則表達式和每個發現值與從哈希值替換它。
+0

這是要走的路..我喜歡它* 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 
+1

使用eval是一個巨大的風險,應儘可能避免 – bjhaid

+1

這是荒謬的。只有盲目地將「eval」應用於用戶輸入纔會有風險。我知道你的觀點已被廣泛接受,但我無法想象爲什麼。 –

+0

你不能猜測代碼的用途是什麼,所以在這裏提出eval可能會更具破壞性,但是我推薦你的解決方案 – bjhaid