如何获得字符串的特定实例,该实例在字符串中多次重复

How do I get a particular instance of a string that repeats multiple times in a string

本文关键字:实例 字符串 何获得      更新时间:2023-10-16

我想将字符串KeyData中的数据(存在为 <eg2keydata>属性(转换为 *。但是,它总是在字符串msg中使用keyData的第一个实例。每次我要转换时如何获取特定实例?我是新手,我无法调试它。我不确定for循环。任何人,请帮助我找到错误。谢谢!!

  const std::string& msg = "<PolicyAction><ManualKeyPolicyAction><TransformData SPI="1219546177"><eg1KeyData Protocol="abc" KeyLength="64" KeyData="d789c"></eg1KeyData><eg2KeyData Protocol="hm" KeyLength="64" KeyData="4328a036abfcf5e9"></eg2KeyData><Tunne<PolicyAction><ManualKeyPolicyAction><TransformData SPI="1219546177"><eg1KeyData Protocol="aes-cbc" KeyLength="64" KeyData="d789c"></eg1KeyData><eg2KeyData Protocol="hmac-sha1-96" KeyLength="64" KeyData="4328a03"></eg2KeyData><SaltData ";
  std::size_t search1 = msg.find("<eg2KeyData");
  const std::string from1 = "KeyData="";
  const std::string to1 = ""></eg2KeyData>";
  std::size_t endpos1 = msg.find(to1);
  std::string s = msg;
  std::size_t l1 = 0;
  if (msg.find("<eg2KeyData") != std::string::npos)
  {
      l1 = msg.find("KeyData="",search1);
    if (l1 != 0)
    {
      std::size_t r1 = endpos1 - l1 - from1.length();
      s.replace(l1 + from1.length(), r1, r1, '*');
    }
  }
  std::cout << s;

最重要的说明:不使用XML库为您执行此操作是疯狂的。尝试适当地对复杂的数据执行此操作,而无需使用一些了解XML格式的东西是一个非常非常糟糕的主意。


如果您想找到刚刚找到的子字符串的下一个实例,则只需要告诉find您想从哪里开始搜索,例如

const std::string& msg = "<PolicyAction><ManualKeyPolicyAction><TransformData SPI="1219546177"><eg1KeyData Protocol="abc" KeyLength="64" KeyData="d789c"></eg1KeyData><eg2KeyData Protocol="hm" KeyLength="64" KeyData="4328a036abfcf5e9"></eg2KeyData><Tunne<PolicyAction><ManualKeyPolicyAction><TransformData SPI="1219546177"><eg1KeyData Protocol="aes-cbc" KeyLength="64" KeyData="d789c"></eg1KeyData><eg2KeyData Protocol="hmac-sha1-96" KeyLength="64" KeyData="4328a03"></eg2KeyData><SaltData ";
size_t p = msg.find("KeyData=");
while (p != std::string::npos)
{
  std::cout << p << " ";
  p = msg.find("KeyData=", p + 1);
}
std::cout << std::endl;

然后给出结果

111 181 342 422

然后,您可以搜索字符串"的下两个实例,并使用这些位置来计算要更改的文本的开始和终点。

只读文档!http://en.cppreference.com/w/cpp/string/basic_string/find

另外,您可以考虑使用正则表达式:

std::regex r("KeyData=\"([a-z0-9]+)\"");
for (auto i = std::sregex_iterator(msg.begin(), msg.end(), r); i != std::sregex_iterator(); i++)
  std::cout << i->position() << " ";
std::cout << std::endl;

这给出了相同的结果。不过,我不会在这里介绍如何使用正则表达式的详细信息。

http://en.cppreference.com/w/cpp/regex