2014-09-24 76 views
1

这里我有一个像这样的字符串WUBWEWUBAREWUBWUBTHEWUBCHAMPIONSWUBMYWUBFRIENDWUB我想要删除所有wub字形式并获得这个结果WE ARE THE CHAMPIONS MY FRIEND
在C++中有没有什么特别的功能可以做到这一点,我发现string::erase,但接力并没有帮助我!
我可以用for循环做到这一点,并找到这个词形式字符串,然后删除它,但我正在寻找更好的方式。 有没有这样做的功能?如何从C++中删除一个字符串形式的字符串

+2

你可以使用'的std :: regex_replace'? – 2014-09-24 14:42:10

+0

或'boost :: algorithm :: replace_all' – Bogdan 2014-09-24 14:43:11

回答

4

你可以使用std::regex_replace

std::string s1 = "WUBWEWUBAREWUBWUBTHEWUBCHAMPIONSWUBMYWUBFRIENDWUB"; 
std::regex target("(WUB)+"); 
std::string replacement = " "; 
std::string s2 = std::regex_replace(s1, target, replacement); 

LIVE DEMO

+0

鉴于OP的期望输出,我认为替换字符串应该包含一个空格。 – 2014-09-24 14:51:01

+0

@FredLarson:好点 - 我会更新答案。 – 2014-09-24 14:52:25

+1

啊,更新后的正则表达式会替换一个空格的连续匹配。好工作。 – 2014-09-24 14:55:54

1

使用boost ::算法:: replace_all

#include <iostream> 
#include <string> 
#include <boost/algorithm/string/replace.hpp> 

int main() 
{ 
    std::string input="WUBWEWUBAREWUBWUBTHEWUBCHAMPIONSWUBMYWUBFRIENDWUB"; 
    boost::algorithm::replace_all(input, "WUB", " "); 
    std::cout << input << std::endl; 
    return 0; 
} 
+0

您能否扩展您的答案以举例说明这将如何应用? – 2014-09-24 14:59:52

+0

增加了一个例子 – 2014-09-24 15:09:41

+0

谢谢 - 这是有帮助的。我想这完全不能应付OP的例子,即'WUBWEWUBAREWUBWUBTHEWUBCHAMPIONSWUBMYWUBFRIENDWUB' - >'我们是我的朋友们的冠军'? – 2014-09-24 15:11:30

1

删除所有出现:

#include <iostream> 

std::string removeAll(std::string str, const std::string& from) { 
    size_t start_pos = 0; 
    while((start_pos = str.find(from)) != std::string::npos) { 
     str.erase(start_pos, from.length()); 
    } 
    return str; 
} 

int main() { 

    std::string s = "WUBWEWUBAREWUBWUBTHEWUBCHAMPIONSWUBMYWUBFRIENDWUB"; 
    s = removeAll(s, "WUB"); 

    return 0; 
} 

http://ideone.com/Hg7Kwa


替换所有出现:

std::string replaceAll(std::string str, const std::string& from, const std::string& to) { 
    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(); 
    } 
    return str; 
} 

int main() { 
    std::string s = "WUBWEWUBAREWUBWUBTHEWUBCHAMPIONSWUBMYWUBFRIENDWUB"; 
    s = replaceAll(s, "WUB", " "); 
    /* replace spaces */ 
    s = replaceAll(s, " ", " "); 

    return 0; 
} 

http://ideone.com/Yc8rGv

+0

从问题中的例子看来,OP似乎希望用一个空格替换一个或多个连续出现的“WUB”。 – 2014-09-24 14:57:25

+0

@PaulR code added – 4pie0 2014-09-24 15:02:18

+0

看起来不错,除了“WUBWUB”应该只给一个空间,我认为,不是两个? – 2014-09-24 15:09:09