Замена регулярного выражения С++ 11

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

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

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

Можно ли это сделать?


person markv    schedule 14.10.2013    source источник
comment
Конечно, вы должны троллить...   -  person Kerrek SB    schedule 15.10.2013
comment
Сопоставление одного тега без вложенных тегов является регулярным.   -  person Platinum Azure    schedule 15.10.2013
comment
Замена ваших конфиденциальных данных точным количеством точек раскроет информацию о конфиденциальных данных. Я бы пересмотрел ваш вопрос.   -  person Olaf Dietsche    schedule 15.10.2013
comment
Тогда не будет ли количество точек указывать на конфиденциальную информацию? На вопрос, если язык не поддерживает обратный вызов, сядьте в цикл find while и перепишите строку [\S\s]*<SensitiveData>(\\d*)</SensitiveData>   -  person    schedule 15.10.2013
comment
Лучше это ([\S\s]*)<SensitiveData>(\\d*)</SensitiveData>   -  person    schedule 15.10.2013
comment
Конфиденциальные данные, о которых идет речь, — это просто номер кредитной карты. Для соответствия PCI нам разрешено регистрировать первые 6 и последние 4 цифры номера. т.е. 4111111111111111 --› 411111......1111 Эти номера могут содержать от 15 до 19 цифр.   -  person markv    schedule 15.10.2013
comment
Хранение номера кредитной карты в XML? У меня нет слов...   -  person mvp    schedule 15.10.2013
comment
@mvp Насколько я понимаю OP, они передают данные XML между внутренними компонентами и сохраняют (регистрируют) только усеченные числа.   -  person user4815162342    schedule 15.10.2013
comment
да - полный номер карты (и другие конфиденциальные данные) постоянно хранятся только в зашифрованном виде (с использованием HSM для управления ключами). Этот вопрос относится к сообщениям на основе XML, отправляемым через SSL между двумя приложениями.   -  person markv    schedule 29.10.2013


Ответы (1)


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