Reputation: 141
How to remove all instances of the pattern from a string?
string str = "red tuna, blue tuna, black tuna, one tuna";
string pattern = "tuna";
Upvotes: 13
Views: 19463
Reputation: 11
A faster algorithm building the string one character at a time and checking if the end matches the substring. The following runs in o(substring * string) where as the above solutions run in o(s^2/t).
string S, T;
cin >> S >> T;
/* Build R, the result string, one character at a time. */
string R;
for (int i = 0; i < S.size(); i++) {
R += S[i];
/* If the end of R matches T then delete it. */
if (R.size() >= T.size() && R.substr(R.size() - T.size()) == T) {
R.resize(R.size() - T.size());
}
}
cout << R << endl;
Upvotes: 1
Reputation: 1681
This is the basic logic for better understanding Here is the code in c++
string s,x; //s is the string , x is the substring
int a,l;
cin>>s>>x;
l=x.length();
while(true)
{
a=s.find(x);
if(a==-1)
{break;} // if substring is not found
else
{
s.erase(a,l); //if substring is found
}
}
if(s.length()==0) // if string length becomes null printing 0
cout<<0<<"\n";
else
cout<<s<<endl; // else printing the string
example: input-shahaha output-shha
Upvotes: 0
Reputation: 43662
This is a basic question and you'd better take a look at the string capabilities in the standard library.
#include <iostream>
#include <string>
int main() {
std::string str = "red tuna, blue tuna, black tuna, one tuna";
std::string pattern = "tuna";
std::string::size_type i = str.find(pattern);
while (i != std::string::npos) {
str.erase(i, pattern.length());
i = str.find(pattern, i);
}
std::cout << str;
}
Since C++11 you have another solution (thanks Joachim for reminding me of this) based on regular expressions
#include <iostream>
#include <string>
#include <regex>
int main() {
std::string str = "red tuna, blue tuna, black tuna, one tuna";
std::regex pattern("tuna");
std::cout << std::regex_replace(str, pattern, "");
}
Upvotes: 12
Reputation: 4529
Removes all instances of the pattern from a string,
#include <string>
#include <iostream>
using namespace std;
void removeSubstrs(string& s, string& p) {
string::size_type n = p.length();
for (string::size_type i = s.find(p);
i != string::npos;
i = s.find(p))
s.erase(i, n);
}
int main() {
string str = "red tuna, blue tuna, black tuna, one tuna";
string pattern = "tuna";
removeSubstrs(str, pattern);
cout << str << endl;
}
Upvotes: 17
Reputation: 384
Try something like:
void replaceAll(std::string& str, const std::string& from, const std::string& to) {
if(from.empty())
return;
size_t start_pos = 0;
while((start_pos = str.find(from, start_pos)) != std::string::npos) {
str.replace(start_pos, from.length(), to);
start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
}
}
From Replace part of a string with another string
Upvotes: 3