[英]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.