替换字符串中的3个或更多字符

时间:2012-10-18 20:36:17

标签: c++ stl

我想在std :: string中找到3次或更多次a来替换。

例如:

std::string foo = "This is a\n\n\n test";
std::string bar = "This is a\n\n\n\n test";
std::string baz = "This is a\n\n\n\n\n test";
std::string boo = "This is a\n\n\n\n\n\n test";
// ... etc.

所有应转换为:

std::string expectedResult = "This is a\n\n test";
如果可能的话,

Vanilla stl将受到赞赏(没有regexp libs或boost)。

3 个答案:

答案 0 :(得分:2)

这应该连续找到\ n并替换它们:

size_type i = foo.find("\n\n\n");
if (i != string::npos) {
    size_type j = foo.find_first_not_of('\n', i);
    foo.replace(i, j - i, "\n\n");
}

答案 1 :(得分:0)

编写一个函数来处理您有兴趣修改的每个字符串:

每次读取每个字符串一个字符。跟踪2个char变量:a和b。对于您阅读的每个字符c,请执行以下操作:

if ( a != b ) {
    a = b;
    b = c;
} else if ( a == b ) {
    if ( a == c ) {
        // Put code here to remove c from your string at this index
    }
}

我不是百分百确定你是否可以直接使用STL的东西来完成你的要求,但正如你所看到的那样,这个逻辑并没有太多代码可以实现。

答案 2 :(得分:0)

您可以使用查找和替换。 (这将取代" \ n \ n \ n ..." - >" \ n \ n")。您可以将位置传递给string :: find,这样您就不必再次搜索字符串的开头(优化)

  int pos = 0;
  while ((pos = s.find ("\n\n\n", pos)) != s.npos)
    s.replace (pos, 3, "\n\n", 2);

这将取代" \ n \ n \ n \ n .." - > " \ n"

  int pos = 0;
  while ((pos = s.find ("\n\n", pos)) != s.npos)
    s.replace (pos, 2, "\n", 1);