gpt4 book ai didi

ruby - 从文件中读取变量并替换

转载 作者:太空宇宙 更新时间:2023-11-03 17:43:53 25 4
gpt4 key购买 nike

我有一个 Apache2 服务器端包含文件。看起来像(已编辑实际数据):

<!--#set var="FIRST_VAR" value="HI" -->
<!--#set var="SECOND_VAR" value"THERE" -->
<!--#set var="FINAL_VAR" value="HEY/${FIRST_VAR}/${SECOND_VAR}/${FINAL_VAR}" -->

我想做的是对命名变量进行正则表达式匹配,然后使用散列构建嵌套变量。示例:

@SSI["FIRST_VAR"] = "HI"
@SSI["SECOND_VAR"] = "THERE"
@SSI["FINAL_VAR"] = "HEY/HI/THERE"

我不知道如何正确地执行此操作。

最佳答案

假设您将文件读入一个字符串,将字符串分成几行并从每行的末尾去除空格。

arr =<<_.lines.map(&:strip)
<!--#set var="V1" value="HI" -->
<!--#set var="V2" value="THERE" -->
<!--#set var="FV" value="HEY/${V1}/${V2}" -->
_
#=> ["<!--#set var=\"V1\" value=\"HI\" -->",
# "<!--#set var=\"V2\" value=\"THERE\" -->",
# "<!--#set var=\"FV\" value=\"HEY/${V1}/${V2}\" -->"]

我将使用以下正则表达式。

r1 = /
(?<=\svar=\") # match ' var="' in a positive lookbehind
.+? # match one or more characters lazily
(?=\") # match '"' in a positive lookahead
/x # free-spacing regex definition mode

r2 = /
(?<=\svalue=\") # match ' value"' in a positive lookbehind
.+? # match one or more characters lazily
(?=\") # match '"' in a positive lookahead
/x # free-spacing regex definition mode

r3 = /
\/\$\{ # match '/${'
\w+ # match one or more word characters
\} # match '}'
/x # free-spacing regex definition mode

r4 = /
(?<=\/\$\{) # match '/${' in a positive lookbehind
.+? # match any number of character, lazily
(?=\}) # match `}` in a positive lookahead
/x # free-spacing regex definition mode

然后我们可以按如下方式计算所需的返回值。

g = arr.each_with_object({}) do |s,h|
var = s[r1].strip
value = s[r2].strip
h["\/\$\{#{var}\}"] = value.gsub(r3) { |s| h.key?(s) ? "/#{h[s]}" : "" }
end
#=> {"/${V1}"=>"HI", "/${V2}"=>"THERE", "/${FV}"=>"HEY/HI/THERE"}

最后,修改键值。

g.each_with_object({}) { |(k,v),h| h[k[r4]] = v }
#=> {"V1"=>"HI", "V2"=>"THERE", "FV"=>"HEY/HI/THERE"}

以上两个表达式当然可以链接起来。事实上,它可以写成一行,但我不推荐它。

关于ruby - 从文件中读取变量并替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45396884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com