【问题标题】:C++11 regex replaceC++11 正则表达式替换
【发布时间】:2013-10-14 21:41:21
【问题描述】:

我有一个想要注销的 XML 字符串。这个 XML 包含一些我想在发送到日志文件之前屏蔽掉的敏感数据。目前使用 std::regex 来做到这一点:

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

目前数据正被正好 6 个 '.' 替换。字符,但是我真正想做的是用正确的点数替换敏感数据。 IE。我想获取捕获组的长度并将确切的点数记下来。

这个可以吗?

【问题讨论】:

  • 单标签匹配,没有嵌套标签,是常规的。
  • 用精确的点数替换敏感数据将揭示有关敏感数据的信息。我会重新考虑你的问题。
  • 那么点数不就代表敏感信息吗?对于这个问题,如果 lang 不支持回调,请坐在 find while 循环中并重写字符串 [\S\s]*&lt;SensitiveData&gt;(\\d*)&lt;/SensitiveData&gt;
  • 这个更好([\S\s]*)&lt;SensitiveData&gt;(\\d*)&lt;/SensitiveData&gt;

标签: c++ regex c++11 capture-group


【解决方案1】:

C++11 正则表达式的regex_replace 不具备您要求的功能——替换格式参数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);
    }
}

【讨论】:

  • 如果标签在不相关的部分&lt;SensitiveData&gt; don't overwrite me &lt;/SensitiveData&gt;被重复使用怎么办?
  • @sln 好点,我发布的代码在这个意义上不是 100% 等效于 OP 的正则表达式。但是,如果 OP 的 XML 的 &lt;SensitiveData&gt; 元素的内容总是包含数字,我不会感到惊讶。更重要的是,如果需要,添加检查 xml[pref:suff] 是否为全数字是一项简单的练习。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2022-06-12
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多