2013-10-14 175 views
0

我有一个XML字符串,我希望注销。这个XML包含一些我想在发送到日志文件之前掩盖的敏感数据。目前使用std :: regex来执行此操作:C++ 11正则表达式替换

std::regex reg("<SensitiveData>(\\d*)</SensitiveData>"); 
return std::regex_replace(xml, reg, "<SensitiveData>......</SensitiveData>"); 

当前数据正被6'替换。字符,但是我真正想要做的是用正确数量的点替换敏感数据。即我想获得捕获组的长度,并将精确的点数减少。

可以这样做吗?

+7

当然[你必须曳(HTTP:// stackoverflow.com/q/1732348/596781)... –

+0

单个标签匹配,没有嵌套标签,是常规的。 –

+0

用精确的点数替换敏感数据将显示有关敏感数据的信息。我会重新考虑你的问题。 –

回答

0

regex_replace C++ 11正则表达式不具备您要求的功能 - 替换格式参数must be a string。一些正则表达式API允许替换为接收匹配的函数,并且它可以执行所需的替换。

但正则表达式不the only way解决一个问题,而在C++中它不完全很难找两个固定字符串和替换字符其间:

const char* const PREFIX = "<SensitiveData>"; 
const char* const SUFFIX = "</SensitiveData>"; 

void replace_sensitive(std::string& xml) { 
    size_t start = 0; 
    while (true) { 
     size_t pref, suff; 
     if ((pref = xml.find(PREFIX, start)) == std::string::npos) 
     break; 
     if ((suff = xml.find(SUFFIX, pref + strlen(PREFIX))) == std::string::npos) 
     break; 
     // replace stuff between prefix and suffix with '.' 
     for (size_t i = pref + strlen(PREFIX); i < suff; i++) 
     xml[i] = '.'; 
     start = suff + strlen(SUFFIX); 
    } 
} 
+0

如果标签在不相关的部分重复使用,那么该怎么办?不要覆盖我? – sln

+0

@sln好的一点,我发布的代码在这个意义上不是100%等同于OP的正则表达式。但是,如果OP的XML的元素的内容总是包含数字,我不会感到惊讶。更重要的是,如果需要的话,添加'xml [pref:suff]'是全数字的检查是一件简单的练习。 – user4815162342