我有由子字符串组成的字符串,例如:
其中 ENV_VAR1 和 ENV_VAR2 等可能是环境变量。 当它们是环境变量时,想要在 字符串及其关联值,如果他们不想要实际的 保留子字符串。
示例1 给定以下环境变量:
ENV_VAR1 = "XYZ"
ENV_VAR2 = "123"
并输入字符串:
"something/${ENV_VAR1}/else|$(ENV_VAR2)"
结果:
"something/XYZ/else|123"
示例2 给定以下环境变量:
ENV_VAR1 = "XYZ"
并输入字符串:
"something/${ENV_VAR1}/else|$(ENV_VAR2)"
结果:
"something/XYZ/else|$(ENV_VAR2)"
以下例程使用 getenv 来查看是否与任何已注册的环境变量匹配,然后继续将匹配项扩展/转换为其在 env 中注册的值。
#include <cstdlib>
#include <regex>
#include <string>
std::string expand_env_variables(const std::string& input)
{
if ((input.find("${") == std::string::npos) && (input.find("$(") == std::string::npos))
{
return input;
}
constexpr auto pattern = R"(([$]\((\w|[^\)]+)\)|[$]\{(\w|[^\}]+)\}))";
static const std::regex envvar_regex(pattern);
std::smatch match;
std::string result = input;
while (std::regex_search(result, match, envvar_regex))
{
const auto& envvar = match.str(!match.str(2).empty() ? 2 : 3);
const char* s = std::getenv(envvar.c_str());
const std::string expanded_var { s ? s : "" };
result.replace(match[0].first, match[0].second, expanded_var);
}
if (input != result)
{
printf("expand_env_variables: Input expanded %s ----> %s\n", input.c_str(), result.c_str());
}
return result;
}
注意:使用幻数 2 和 3 是因为正则表达式匹配组的索引,在使用条件正则表达式模式时出现。