C++11 正则表达式替换

C++11 regex replace

本文关键字:替换 正则表达式 C++11      更新时间:2023-10-16

我有一个 XML 字符串,我想注销。 此 XML 包含一些敏感数据,我想在发送到日志文件之前屏蔽这些数据。 当前使用 std::regex 来执行此操作:

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

正好被 6 个"."字符替换,但我真正想做的是用正确数量的点替换敏感数据。 即我想获取捕获组的长度并放下确切的点数。

这能做到吗?

C++11 个正则表达式中的regex_replace没有您要求的功能 — 替换格式参数必须是字符串。某些正则表达式 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);
    }
}