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

Sar*_*rah 11 c++ string algorithm str-replace

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

到目前为止,我可以替换第一次出现的字符串,但是我无法在下一次出现此字符串时这样做.

这就是我的工作,有点像:

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

如果找不到字符串,则根本不打印任何内容,因此不好.

我知道我需要遍历整个字符串chartDataString并替换所有出现的事件.我知道有很多类似的帖子,但我不明白(像这样用另一个子串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");   
   }
}
Run Code Online (Sandbox Code Playgroud)

编辑考虑到建议,这在理论上应该有效,但我不知道为什么不这样做

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();
}   
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 22

尝试以下方法

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 但是,如果字符串为 1MB,并且在其中找到替换的 char 100 次,则这意味着仅分配 100MB 100 字节。 (3认同)

小智 11

使用 C++11 中可用的 std::regex_replace。这正是您想要的,甚至更多。

https://en.cppreference.com/w/cpp/regex/regex_replace

std::string const result = std::regex_replace( chartDataString, std::regex( "\\*A" ), "[A]\n" );
Run Code Online (Sandbox Code Playgroud)


Guy*_*ham 6

如果boost可用,您可以使用以下内容:

std::string origStr = "this string has *A and then another *A";
std::string subStringToRemove = "*A";
std::string subStringToReplace = "[A]";

boost::replace_all(origStr , subStringToRemove , subStringToReplace);
Run Code Online (Sandbox Code Playgroud)

要对原始字符串执行修改,请执行

std::string result = boost::replace_all_copy(origStr , subStringToRemove , subStringToReplace);
Run Code Online (Sandbox Code Playgroud)

在不修改原始字符串的情况下执行修改.