2013-10-14 130 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