C ++ 11 регулярное выражение заменить

0

У меня есть строка XML, которую я хочу выйти из системы. этот XML содержит некоторые конфиденциальные данные, которые я хотел бы замаскировать перед отправкой в файл журнала. В настоящее время используется std :: regex для этого:

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

В настоящее время данные заменяются ровно на 6 '.' однако, что я действительно хочу сделать, это заменить чувствительные данные правильным количеством точек. Т.е. я хотел бы получить длину группы захвата и положить это точное количество точек вниз.

Это можно сделать?

Теги:
c++11

1 ответ

0
Лучший ответ

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);
    }
}
  • 0
    Что если тег повторно используется в несвязанном разделе <SensitiveData> don't overwrite me </SensitiveData> ?
  • 0
    @sln Хорошо, код, который я разместил, в этом смысле не на 100% эквивалентен регулярному выражению OP. Но я не удивлюсь, если содержимое элемента <SensitiveData> в XML OP всегда содержит цифры. Что еще более важно, это тривиальное упражнение, чтобы добавить проверку, что xml[pref:suff] является целым числом, если необходимо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню