0

我想在 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";

如果可能的话,香草 stl 将不胜感激(没有正则表达式库或增强)。

4

3 回答 3

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");
}
于 2012-10-18T20:51:33.113 回答
0

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

一次读取每个字符串一个字符。跟踪 2 个字符变量: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
    }
}

我不是 100% 确定您是否可以直接使用 STL 中的某些东西来完成您的要求,但是正如您所看到的,这个逻辑并没有太多代码可以实现。

于 2012-10-18T20:51:12.960 回答
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);
于 2012-10-18T20:55:52.197 回答