У меня есть строка XML, которую я хочу выйти. этот XML содержит некоторые конфиденциальные данные, которые я хотел бы замаскировать перед отправкой в файл журнала. В настоящее время для этого используется std :: regex:
std::regex reg("<SensitiveData>(\\d*)</SensitiveData>");
return std::regex_replace(xml, reg, "<SensitiveData>......</SensitiveData>");
В настоящее время данные заменяются ровно на 6 ‘.’ символы, однако, что я действительно хочу сделать, это заменить конфиденциальные данные с правильным количеством точек. То есть Я хотел бы определить длину группы захвата и указать точное количество точек.
Можно ли это сделать?
regex_replace
регулярных выражений C ++ 11 не имеет запрашиваемой вами возможности — аргумент формата замены должен быть строкой. Некоторые API регулярных выражений позволяют замене быть функцией, которая получает совпадение и может выполнять именно то, что вам нужно.
Но регулярные выражения не единственный способ чтобы решить проблему, и в 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);
}
}
Других решений пока нет …