簡體   English   中英

使用正則表達式替換字符串中的參數

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM