[英]Using regex to replace parameters in a string
我試圖遍歷結構的元素,查找包含格式{...}
字符串,並用散列中的相應字符串替換它們。 這是我正在使用的數據:
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:
request.each do |value|
value.gsub!(/{(.+?)}/, parameters["\1"])
end
在此嘗試中, parameters["\\1"] == nil
。
嘗試2:
request.each do |value|
value.scan(/{(.+?)}/) do |match|
value.gsub!(/{(.+?)}/, parameters[match[0]])
end
end
這導致request.user == "first first"
。 嘗試parameters[match]
結果nil
。
誰能協助解決這個問題?
你的嘗試都不會起作用,因為gsub!
論點gsub!
在gsub!
調用之前進行評估gsub!
。 在更換之前將評估parameters[...]
,因此無法反映匹配。 此外,即使該字符串是gsub!
的直接參數, "\\1"
也不會被第一次捕獲所取代gsub!
。 你需要轉義像"\\\\1
”這樣的轉義字符。 為了使它工作,你需要給gsub!
一個塊gsub!
。
但是,不要這樣做,嘗試使用已經存在的東西。 您應該使用字符串格式%{}
並使用符號作為哈希。
request.user = "%{user} %{name}"
request.password = "%{password}"
parameters = {user: "first", name: "last", password: "secret"}
request.each do |value|
value.replace(value % parameters)
end
你可以使用帶有塊的gsub
。
request.each do |e|
e.gsub!(/{.+?}/) { |m| parameters[m[1...-1]] } if e
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.