如何获得字符串的特定实例,该实例在字符串中多次重复
How do I get a particular instance of a string that repeats multiple times in a string
我想将字符串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
相关文章:
- 在字符串函数中抛出'char const*'实例后调用的终止
- C++:递归地将字符串中一个字母的所有实例替换为另一个字母
- 使用具有 string.reserve() 的字符串实例化结构
- 有没有办法通过作为用户输入的字符串来创建类实例名称?
- 获取具有同一分隔符的多个实例的字符串的子字符串
- 如何获得字符串的特定实例,该实例在字符串中多次重复
- 反向函数不反转类实例化的引用字符串
- 使用正则表达式在字符串中找到多个实例
- 防止为字符串流提取运算符不支持的类型实例化模板类 (>>)
- 从字符串中删除字符的第一个和最后一个实例
- C++,将数组中的重复实例返回到字符串
- 为什么我不能通过执行 "myVector[i].data()" 来实例化一个类,其中 myVector[i].data() 是一个字符串?
- 一种程序,用户输入一个字符串,程序对字母的实例进行计数
- 从设备实例路径字符串获取设备实例 DWORD
- C++/CX - 我需要从常量字符*实例化一个平台::字符串
- C 将条目添加到具有字符串和类实例的STL映射中,作为指针
- 如何为字符串数组实例变量动态分配空间
- 用regex在引号下选择字符串的第二个实例
- 字符串实例化问题
- 如何实例化C++成员字符串引用