拆分字符串withisalnum并存储到字符串向量中

时间:2016-11-11 04:10:40

标签: c++ string parsing stringstream

我正在处理一个字符串并尝试在非字母数字(不是a-z,A-Z和0-9)时将其分解。我发现isalnum是一个有用的功能。

例如,如果我有字符串“bob-michael!#mi%@ pa hi3llary-tru1mp”

载体应包含:bob,michael,mi,pa,hi3llary和tru1mp。

我目前的代码是:

$item->returned_at = DEFAULT_VALUE;

我的想法是使用循环,而isalnum导致1继续前进,如果isalnum导致0然后将我到目前为止的任何内容推送到字符串向量中。也许我可以使用isalnum作为delim?我很难接受我的想法并写下这个。有人能指出我正确的方向吗?谢谢!

编辑:感谢大家的帮助。

3 个答案:

答案 0 :(得分:4)

这些方面的一些东西,也许是:

std::vector<std::string> result;
std::string something = "bob-michael !#mi%@pa hi3llary-tru1mp";
std::regex token("[A-Za-z0-9]+");

std::copy(
    std::sregex_token_iterator(something.begin(), something.end(), token),
    std::sregex_token_iterator(),
    std::back_inserter(result));

Demo

答案 1 :(得分:1)

你也可以遍历字符串然后检查当前索引是否是一个字母,然后如果不打破它然后存储到vector

std::string something = "bob-michael !#mi%@pa hi3llary-tru1mp";

std::vector<std::string> result;

std::string newResult = "";

for ( int a = 0; a < something.size(); a++ )
{
      if((something[a] >= 'a' && something[a] <= 'z')||(something[a] >= 'A' && something[a] <= 'Z')
          || (something[a] >= '0' && something[a] <= '9'))
      {
          newResult += something[a];
      }
      else
      {
         if(newResult.size() > 0)
         {
            result.push_back(newResult);
            newResult = "";
         }
      }
}
result.push_back(newResult);

答案 2 :(得分:1)

我评论过的std::replace_if技巧原来并不像我想象的那么简单,因为std::isalnum没有返回bool

#include <iostream>
#include <vector>
#include <string>
#include <cctype>
#include <algorithm>
#include <sstream>
#include <iterator>

int main()
{
    std::vector<std::string> result;
    std::string something = "bob-michael !#mi%@pa hi3llary-tru1mp";
    // I expected replace_if(something.begin(), something.end(), &isalnum, " ");
    // would work, but then I did a bit of reading and found is alnum returned int,
    // not bool. resolving this by wrapping isalnum in a lambda
    std::replace_if(something.begin(),
                    something.end(),
                    [](char val)->bool {
                          return std::isalnum(val) == 0;
                     },
                     ' ');
    std::stringstream pie(something);

    // read stream into vector
    std::copy(std::istream_iterator<std::string>(pie),
              std::istream_iterator<std::string>(),
              std::back_inserter<std::vector<std::string>>(result));

    // prove it works
    for(const std::string & str: result)
    {
        std::cout << str << std::endl;
    }
}