我有一个表格的字符串:
http://stackoverflow.com/q""uestions/ask/%33854@/á
现在我要删除此字符串中的所有字符,但alphnumeric和://输出字符串变为:
http://stackoverflow.com/questions/ask/33854/á
我知道我可以逐个字符遍历这个字符串并删除不必要的字符。但是在某些标准库中是否有一些功能可以帮助我删除不需要的字符。如果我知道不需要的字符,那么我可以使用std :: remove和std :: replace来有选择地删除或替换。但在这里我不知道未知的角色,我只知道我想留下的角色。
我是否有某种方式可以保留必要的字符并删除不需要的字符。
我使用的gcc版本是: gcc(GCC)4.4.7 20120313(Red Hat 4.4.7-4)
编辑:我也想包括像á这样的人物。我不知道他们叫什么。我知道他们不是alph-numeric。但我没有得到如何检查它们答案 0 :(得分:3)
由于您的编译器很古老,并且正则表达式支持在gcc中相对较新(从gcc 4.9转发),因此正则表达式不是一种选择。我们将erase-remove idiom与命名函数一起使用,因为Gcc 4.4还不支持lambdas。
#include <algorithm>
#include <iostream>
#include <locale>
#include <string>
// true for characters that should be removed
bool is_special_character(char c) {
std::locale loc("your_locale_string_here");
return !std::isalnum(c, loc) && c != ':' && c != '/' && c != '.';
}
int main()
{
std::string s = "http://stackoverflow.com/q\"\"uestions/ask/%33854@";
// interesting part here
s.erase(std::remove_if(s.begin(), s.end(), is_special_character), s.end());
std::cout << s << '\n';
}
答案 1 :(得分:2)
您将需要使用std::remove_if
并定义谓词,仅当字符是您要保留的字符时才返回false。
执行此过程后,您还希望将字符串的大小调整为新的长度。举个例子:
#include <string>
#include <algorithm>
#include <iostream>
#include <locale>
bool is_special_char(char c)
{
return !( std::isalnum(c) || c == ':' || c == '/' || c == '.');
}
int main()
{
std::string s = "http://stackoverflow.com/q\"\"uestions/ask/\%33854@";
std::cout << s << std::endl;
std::string::iterator new_end = std::remove_if(s.begin(), s.end(), is_special_char);
s.resize(new_end - s.begin());
std::cout << s << std::endl;
}
将输出
http://stackoverflow.com/q""uestions/ask/%33854@
http://stackoverflow.com/questions/ask/33854
如果要合并unicode字符,则需要使用wstring
而不是字符串,使用此示例(并结合Wintermute很好地使用擦除/删除习惯用法)将是。< / p>
#include <string>
#include <algorithm>
#include <iostream>
#include <locale>
bool is_special_char(wchar_t c)
{
return !( std::iswalnum(c) || c == ':' || c == '/' || c == '.');
}
int main()
{
std::locale::global( std::locale("en_US.UTF-8") ); //Set the global locale to Unicode
std::wstring s = L"http://stáckoverflow.com/q\"\"uestions/ask/%33854@";
std::wcout << s << std::endl;
s.erase( std::remove_if(s.begin(), s.end(), is_special_char), s.end() );
std::wcout << s << std::endl;
}
将输出
http://stáckoverflow.com/q""uestions/ask/%33854@
http://stáckoverflow.com/questions/ask/33854
答案 2 :(得分:1)
但在这里我不知道未知的角色,我只知道我想留下的角色。
例如,使用char数组将要保留的字符列入白名单。然后浏览字符串中的每个字符,如果它不在白名单中,则删除它。
答案 3 :(得分:-1)
你可以尝试类似的东西:
std::string str ("This is an example sentence.");
std::cout << str << '\n';
// "This is an example sentence."
str.erase (10,8); // ^^^^^^^^
std::cout << str << '\n';
// "This is an sentence."
str.erase (str.begin()+9); // ^
std::cout << str << '\n';
// "This is a sentence."
str.erase (str.begin()+5, str.end()-9); // ^^^^^
std::cout << str << '\n';
// "This sentence."