将字符串拆分为具有多个分隔符的多个字符串而不删除?

时间:2013-10-23 08:28:41

标签: c++ regex string vector split

我使用boost框架,所以它可能会有所帮助,但我还没有找到必要的功能。

对于通常的快速分裂,我可以使用:

string str = ...;
vector<string> strs;
boost::split(strs, str, boost::is_any_of("mM"));

但它删除了m和M字符。

我也不能使用regexp,因为它会在字符串中搜索满足定义模式的最长值。

P.S。有很多类似的问题,但他们只用其他编程语言描述这种实现。

3 个答案:

答案 0 :(得分:3)

未经测试,但不是使用vector<string>,您可以尝试vector<boost::iterator_range<std::string::iterator>>(因此您可以获得每个标记的主字符串的一对迭代器。然后迭代(范围的起始点-1 [只要范围的开始不是主串的begin(),到范围的结尾)

编辑:这是一个例子:

#include <iostream>
#include <string>

#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>
#include <boost/range/iterator_range.hpp>

int main(void)
{
  std::string str = "FooMBarMSFM";

  std::vector<boost::iterator_range<std::string::iterator>> tokens;

  boost::split(tokens, str, boost::is_any_of("mM"));

  for(auto r : tokens)
  {
    std::string b(r.begin(), r.end());
    std::cout << b << std::endl;
    if (r.begin() != str.begin())
    {
      std::string bm(std::prev(r.begin()), r.end());
      std::cout << "With token: [" << bm << "]" << std::endl;
    }
  }
}

答案 1 :(得分:1)

您的需求超出了split的概念。如果您想保留“m或M”,则可以按strstrstrchrstrtokfind功能编写特殊分组。您可以更改一些代码以生成灵活的split函数。 这是一个例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void split(char *src, const char *separator, char **dest, int *num)
{
    char *pNext;
    int count = 0;

    if (src == NULL || strlen(src) == 0) return;
    if (separator == NULL || strlen(separator) == 0) return; 

    pNext = strtok(src,separator);

    while(pNext != NULL)
    {
        *dest++ = pNext;
        ++count;
        pNext = strtok(NULL,separator);
    }

    *num = count;
}

此外,您可以尝试boost::regex

答案 2 :(得分:0)

我目前的解决方案如下(但它不是通用的,看起来太复杂了。)

我选择了一个无法出现在此字符串中的字符。就我而言,它是'|'。

string str = ...;
vector<string> strs;
boost::split(strs, str, boost::is_any_of("m"));
str = boost::join(strs, "|m");
boost::split(strs, str, boost::is_any_of("M"));
str = boost::join(strs, "|M");
if (boost::iequals(str.substr(0, 1), "|") {

    str = str.substr(1);
}
boost::split(strs, str, boost::is_any_of("|"));

我添加“|”在每个符号m / M之前,除了字符串中的第一个位置。然后我将字符串拆分为子字符串,删除了这个额外的字符