2015-12-15 15 views
7

構造体の要素を反復処理し、フォーマット{...}を含む文字列を探し、対応する文字列をハッシュから置き換えようとしています。これは私が使用しているデータです。正規表現を使用して文字列のパラメータを置換する

Request = Struct.new(:method, :url, :user, :password) 
request = Request.new 
request.user = "{user} {name}" 
request.password = "{password}" 
parameters = {"user" => "first", "name" => "last", "password" => "secret"} 

これが試み1:この試み、parameters["\1"] == nil

request.each do |value| 
    value.gsub!(/{(.+?)}/, parameters["\1"]) 
end 

試み2:

request.each do |value| 
    value.scan(/{(.+?)}/) do |match| 
    value.gsub!(/{(.+?)}/, parameters[match[0]]) 
    end 
end 

これはrequest.user == "first first"になります。試してparameters[match]の結果はnilです。

誰でもこれを解決できますか?

答えて

5

gsub!の引数がgsub!の呼び出しの前に評価されるため、いずれの試みも機能しません。 parameters[...]は交換前に評価されるため、一致を反映する方法はありません。さらに、"\1"は、その文字列がgsub!の直接引数であっても、最初のキャプチャに置き換えられません。あなたはgsub!にブロックを与える必要があり、それを動作させるために。「"\\1のようにエスケープ文字をエスケープする必要があります。

しかし、その代わりにそれを行うの、すでにあるものを使用するようにしてください。あなたは、文字列の形式を使用する必要があります%{}とハッシュの利用シンボル。

request.user = "%{user} %{name}" 
request.password = "%{password}" 
parameters = {user: "first", name: "last", password: "secret"} 
request.each do |value| 
    value.replace(value % parameters) 
end 
+0

@sawaこんにちは、あなたの答えは素晴らしいですが、あなたは '値%parameters'背後に魔法を説明してくださいすることができます。私は見ていない前にこの方法で使用された%演算子。 – Scotty

+0

http://ruby-doc.org/core-2.2.0/String.html#method-i-25 – sawa

1

あなたはブロックでgsubを使用することができます。

request.each do |e| 
    e.gsub!(/{.+?}/) { |m| parameters[m[1...-1]] } if e 
end