C++ - 正则表达式拆分字符串

not*_*ere 18 c++ regex string split

我想分割std::string的regex.

我在Stackoverflow上找到了一些解决方案,但是大多数都是通过单个空格或使用外部库(如boost)拆分字符串.

我不能用boost.

我想用正则表达式分割字符串 - "\\s+".

我正在使用这个g ++版本g++ (Debian 4.4.5-8) 4.4.5,我无法升级.

Pet*_*ker 43

std::regex rgx("\\s+");
std::sregex_token_iterator iter(string_to_split.begin(),
    string_to_split.end(),
    rgx,
    -1);
std::sregex_token_iterator end;
for ( ; iter != end; ++iter)
    std::cout << *iter << '\n';
Run Code Online (Sandbox Code Playgroud)

在-1这里的关键是:当迭代器在那之前的比赛和每次递增后,在随后的一次匹配文本的迭代器指向文本构建迭代点.

如果你没有C++ 11,同样的东西应该与TR1一起使用或者(可能稍加修改)与Boost一起使用.


shf*_*301 9

如果您只想将字符串拆分多个空格,则不需要使用正则表达式.编写自己的正则表达式库对于简单的事情来说是过度的.

您在评论中链接到的答案,在C++中拆分字符串?,如果有多个空格,可以很容易地更改,以便它不包含任何空元素.

std::vector<std::string> &split(const std::string &s, char delim,std::vector<std::string> &elems) {
    std::stringstream ss(s);
    std::string item;
    while (std::getline(ss, item, delim)) {
        if (item.length() > 0) {
            elems.push_back(item);  
        }
    }
    return elems;
}


std::vector<std::string> split(const std::string &s, char delim) {
    std::vector<std::string> elems;
    split(s, delim, elems);
    return elems;
}
Run Code Online (Sandbox Code Playgroud)

通过检查item.length() > 0前推item到elems矢量您将不再获得额外的元素,如果你输入包含多个分隔符(在你的情况空格)

  • 你也应该同意这样的事实:使用C++来分割字符串看起来就像是更大的过度杀伤,在C#中你只需要`str.split(...)`;) (2认同)

Mar*_*cin 7

为了扩展@Pete Becker的答案,我提供了resplit函数的示例,可以使用regexp来分割文本:

  std::vector<std::string>
  resplit(const std::string & s, std::string rgx_str = "\\s+") {


      std::vector<std::string> elems;

      std::regex rgx (rgx_str);

      std::sregex_token_iterator iter(s.begin(), s.end(), rgx, -1);
      std::sregex_token_iterator end;

      while (iter != end)  {
          //std::cout << "S43:" << *iter << std::endl;
          elems.push_back(*iter);
          ++iter;
      }

      return elems;

  }
Run Code Online (Sandbox Code Playgroud)

其工作原理如下:

   string s1 = "first   second third    ";
   vector<string> v22 = my::resplit(s1);

   for (const auto & e: v22) {
       cout <<"Token:" << e << endl;
   }


   //Token:first
   //Token:second
   //Token:third


   string s222 = "first|second:third,forth";
   vector<string> v222 = my::resplit(s222, "[|:,]");

   for (const auto & e: v222) {
       cout <<"Token:" << e << endl;
   }


   //Token:first
   //Token:second
   //Token:third
   //Token:forth
Run Code Online (Sandbox Code Playgroud)