如何获取lua字符串匹配来解析环境变量字符串?

Mat*_*att 2 lua string-matching luajit lua-patterns

我有一个用lua编写的配置文件解析器.

我想检测作为环境变量的值并使用os.getenv更改它们.

这可能有点雄心勃勃,因为我可以拥有像这样的价值观

"a string with an embedded ${VARIABLE} in here"
Run Code Online (Sandbox Code Playgroud)

要么

"another string with an env $VARIABLE"
Run Code Online (Sandbox Code Playgroud)

而且我应该允许使用double $$来逃避它们以允许文字$.

我该怎么做呢?

这是我到目前为止所做的,但这是不对的

local envvar = string.match(value, "%$([%w_]+)")
if envvar then
  print("Envvar=", envvar)
  value = value:gsub("(%$[%w_]+)", os.getenv(envvar))
end
Run Code Online (Sandbox Code Playgroud)

例如,我无法弄清楚如何在此处使用%b余额选项来正确匹配{}组合.并使它们可选.如何稳健地完成这项工作?

事实上,我意识到它可能比这更复杂.如果指定了多个环境变量怎么办?

Ego*_*off 5

local text = [[
Example: ${LANG}, $TEXTDOMAINDIR, $$10.00, $$LANG, $UNDEFINED
Nested braces: {{${SHELL}}}
]]
text = text:gsub('$%$','\0')
           :gsub('${([%w_]+)}', os.getenv)
           :gsub('$([%w_]+)', os.getenv)
           :gsub('%z','$')
print(text)
--> Example: en_US.UTF-8, /usr/share/locale/, $10.00, $LANG, $UNDEFINED
--> Nested braces: {{/bin/bash}}
Run Code Online (Sandbox Code Playgroud)