【发布时间】:2021-03-30 19:39:31
【问题描述】:
我想要做的是用类似语法[[VULKAN_SDK]] 在字符串中替换所有标记。我想获取括号的内容(在本例中为VULKAN_SDK),并通过传递括号的内容将整个令牌替换为我从getenv 获得的值。示例 [[VULKAN_SDK]] 被 C:\VulkanSDK\1.2.148.1(系统环境变量)替换。
如果环境变量不存在,则不应替换令牌。
这是我的代码:
void replaceSystemEnviromentTokens(std::string& var) {
static const char* tokenOpening = "[[";
static const char* tokenClosure = "]]";
auto getEnvVal = [](const char* var) {
char * val = std::getenv(var);
return val == NULL ? std::string() : std::string(val);
};
std::size_t temp = var.find(tokenOpening, 0);
while(temp != std::string::npos) {
const std::size_t beginning = temp;
const std::size_t end = var.find(tokenClosure, beginning);
temp = var.find(tokenOpening, beginning + 1);
if(end == std::string::npos)
break;
if(temp != std::string::npos)
if(end > temp)
continue;
const std::size_t tokenSize = end - (beginning + strlen(tokenOpening));
const std::string token = var.substr(beginning + strlen(tokenOpening), tokenSize);
const std::string translatedToken = getEnvVal(token.c_str());
if(!translatedToken.empty()) {
const std::size_t currentSize = var.length();
var.replace(beginning, end, translatedToken);
if(temp != std::string::npos) {
temp += currentSize - var.length();
if(temp > var.length())
temp = std::string::npos;
}
}
}
}
测试:
int main(int argc, char** argv) {
std::string test = "this should be converted: [[VULKAN_SDK]] this should not be converted: VULKAN_SDK]] this: [[VULKAN_SDK]]";
replaceSystemEnviromentTokens(test);
std::cout << test << std::endl;
}
当前行为:this should be converted: C:\VulkanSDK\1.2.148.1erted: VULKAN_SDK]] this: [[VULKAN_SDK]]
预期行为:this should be converted: C:\VulkanSDK\1.2.148.1 this should not be converted: VULKAN_SDK]] this: C:\VulkanSDK\1.2.148.1
【问题讨论】:
-
为什么不用c++17内置的
replace()函数呢? -
会有
test = "this should be replaced [[vul[kan]]"?这样的字符串在这种情况下会发生什么?我想问的是,'['或']'字符会像任何其他普通字符一样出现在字符串中吗? -
或
test = "abc [[vul[[kan]] xyz"或test = "abc [[[kan]] xyz"? -
或者如果
test = "abc [[vul [[jjk]] hkj [[hjh]] [[nj [[ hjgk[[ ]]ghjg[[gfgh]] ]] ]] [[kan]] xyz"
标签: c++ string algorithm replace c++17