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)
小智 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)
如果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)
在不修改原始字符串的情况下执行修改.