如何查找和替换字符串中所有出现的子字符串?

新手上路,请多包涵

我需要搜索一个字符串并编辑它的格式。

到目前为止,我可以替换字符串的第一次出现,但我无法用该字符串的下一次出现来替换。

这就是我的工作,有点:

 if(chartDataString.find("*A") == string::npos){ return;}
else{chartDataString.replace(chartDataString.find("*A"), 3,"[A]\n");}

如果它没有找到字符串,则根本不会打印任何内容,所以这不好。

我知道我需要遍历整个字符串 chartDataString 并替换所有出现的地方。我知道有很多类似的帖子,但我不明白(比如这个 Replace substring with another substring C++

我也尝试做这样的事情来循环字符串:

 string toSearch = chartDataString;
string toFind = "*A:";
for (int i = 0; i<toSearch.length() - toFind.length(); i++){
   if(toSearch.substr(i, toFind.length()) == toFind){
       chartDataString.replace(chartDataString.find(toFind), 3, "[A]\n");
   }
}

编辑考虑到建议,这在理论上应该可行,但我不知道为什么它不

size_t startPos=0;
string myString = "*A";
while(string::npos != (startPos = chartDataString.find(myString, startPos))){
    chartDataString.replace(chartDataString.find(myString, startPos), 3, "*A\n");
    startPos = startPos + myString.length();
}

原文由 Sarah 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 488
2 个回答

尝试以下

const std::string s = "*A";
const std::string t = "*A\n";

std::string::size_type n = 0;
while ( ( n = chartDataString.find( s, n ) ) != std::string::npos )
{
    chartDataString.replace( n, s.size(), t );
    n += t.size();
}

原文由 Vlad from Moscow 发布,翻译遵循 CC BY-SA 3.0 许可协议

就地做这件事相当尴尬(而且可能效率不高)。我通常使用以下功能:

 std::string
replaceAll( std::string const& original, std::string const& from, std::string const& to )
{
    std::string results;
    std::string::const_iterator end = original.end();
    std::string::const_iterator current = original.begin();
    std::string::const_iterator next = std::search( current, end, from.begin(), from.end() );
    while ( next != end ) {
        results.append( current, next );
        results.append( to );
        current = next + from.size();
        next = std::search( current, end, from.begin(), from.end() );
    }
    results.append( current, next );
    return results;
}

基本上,只要找到 from 的实例,您就可以循环,附加中间文本和 to ,然后前进到 from 的下一个实例。最后,在 from 的最后一个实例之后附加任何文本。

(如果您要在 C++ 中进行大量编程,那么习惯于使用迭代器可能是一个好主意,就像上面那样,而不是 std::string 的特殊成员函数。像上面这样的事情可以是可以与任何 C++ 容器类型一起使用,因此更符合习惯。)

原文由 James Kanze 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题