在C ++中保留字符串中只需要的字符

时间:2015-04-07 09:45:21

标签: c++ c regex string gcc

我有一个表格的字符串:

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。但我没有得到如何检查它们

4 个答案:

答案 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."