8

如何在 C++ 中将字符串拆分为标记?

4

6 回答 6

15

这对我来说很好用:),它把结果放在elems. delim可以是任何char.

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)) {
        elems.push_back(item);
    }
    return elems;
}
于 2008-11-09T00:26:22.307 回答
5

有了这个包含 Boost 的Mingw 发行版:

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <ostream>
#include <algorithm>
#include <boost/algorithm/string.hpp>
using namespace std;
using namespace boost;

int main() {
    vector<string> v;
    split(v, "1=2&3=4&5=6", is_any_of("=&"));
    copy(v.begin(), v.end(), ostream_iterator<string>(cout, "\n"));
}
于 2008-11-09T07:13:08.850 回答
4

您可以使用 C 函数strtok

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

Boost Tokenizer也可以完成这项工作:

#include<iostream>
#include<boost/tokenizer.hpp>
#include<string>

int main(){
   using namespace std;
   using namespace boost;
   string s = "This is,  a test";
   tokenizer<> tok(s);
   for(tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){
       cout << *beg << "\n";
   }
}
于 2008-11-09T06:20:33.357 回答
3

尝试使用字符串流:

std::string   line("A line of tokens");
std::stringstream lineStream(line);

std::string token;
while(lineStream >> token)
{
}

看看我对你最后一个问题的回答:
C++ Reading file Tokens

于 2008-11-09T00:22:23.110 回答
3

另请参阅字符串算法库中的 boost::split

string str1("你好 abc-*-ABC-*-aBc 再见");
矢量<字符串> 标记;
boost::split(tokens, str1, boost::is_any_of("-*"));
// 标记 == { "hello abc","ABC","aBc goodbye" }

于 2008-11-09T10:37:52.620 回答
1

这取决于令牌分隔符的复杂程度以及是否有多个。对于简单的问题,只需使用 std::istringstream 和 std::getline。对于更复杂的任务,或者如果您想以符合 STL 的方式迭代令牌,请使用 Boost 的 Tokenizer。另一种可能性(尽管比这两个更混乱)是设置一个 while 循环,该循环调用 std::string::find 并将最后找到的标记的位置更新为搜索下一个标记的起点。但这可能是 3 个选项中最容易出错的一个。

于 2008-11-09T00:21:50.663 回答