根据 env 值转换 envvar 样式子字符串

问题描述 投票:0回答:1

我有由子字符串组成的字符串,例如:

  • ${ENV_VAR1}
  • $(ENV_VAR2)

其中 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)"
c++
1个回答
0
投票

以下例程使用 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 是因为正则表达式匹配组的索引,在使用条件正则表达式模式时出现。

© www.soinside.com 2019 - 2024. All rights reserved.