2014-09-24 2 views
1

Здесь у меня есть строка, подобная этой WUBWEWUBAREWUBWUBTHEWUBCHAMPIONSWUBMYWUBFRIENDWUB Я хочу удалить все wub word form this и получить этот результат WE ARE THE CHAMPIONS MY FRIEND.
Есть ли какая-либо особая функция в C++ для этого, что я нашел string::erase, но это реле не помогает мне !!
Я могу сделать это с помощью цикла for и найти эту строку слова, а затем удалить ее, но я ищу лучший способ. Есть ли какая-нибудь функция для этого?Как удалить подстроку из строки в C++

+2

Вы можете использовать 'зОго :: regex_replace'? –

+0

Или 'boost :: algorithm :: replace_all' – Bogdan

ответ

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, я думаю, что строка замены должна содержать пробел. –

+0

@FredLarson: хорошая точка - я обновлю ответ. –

+1

А, а обновленное регулярное выражение заменяет последовательные совпадения одним пространством. Хорошая работа. –

1

Использование подталкивание :: Алгоритм :: 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

Не могли бы вы расширить свой ответ, чтобы привести пример того, как это будет применяться? –

+0

добавлен пример –

+0

Спасибо - это полезно. Наверное, это вряд ли справится с примером OP, т. Е. «WUBWEWUBAREWUBWUBTHEWUBCHAMPIONSWUBMYWUBFRIENDWUB» -> «МЫ ЧЕМПИОНЫ МОИ ДРУГА»? –

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» с одним пробелом. –

+0

@PaulR код добавлен – 4pie0

+0

Выглядит хорошо, кроме «WUBWUB» должно дать только одно пространство, я думаю, не два? –

Смежные вопросы