【问题标题】:C++ Boost: Split StringC++ Boost:拆分字符串
【发布时间】:2009-12-13 18:27:53
【问题描述】:

如何使用 Boost 和正则表达式拆分字符串并将分隔符包含在结果列表中?

例如,如果我有字符串“1d2”并且我的正则表达式是“[a-z]”,我希望将结果放在一个带有 (1, d, 2) 的向量中

我有:

std::string expression = "1d2";
boost::regex re("[a-z]");
boost::sregex_token_iterator i (expression.begin (),
                                expression.end (), 
                                re);
boost::sregex_token_iterator j;
std::vector <std::string> splitResults;
std::copy (i, j, std::back_inserter (splitResults)); 

谢谢

【问题讨论】:

  • 我认为您可以使用拆分作为起点,但必须编写一些额外的代码才能将其余内容也包含在结果中

标签: c++ regex string boost tokenize


【解决方案1】:

我认为您不能使用 boost::regex 直接提取分隔符。但是,您可以提取字符串中正则表达式所在的位置:

std::string expression = "1a234bc";
boost::regex re("[a-z]");
boost::sregex_iterator i(
  expression.begin (),     
  expression.end (),     
  re);
boost::sregex_iterator j;
for(; i!=j; ++i) {
  std::cout << (*i).position() << " : " << (*i) <<  std::endl;
}

这个例子会显示:

1 : 一个

5:b

6:c

使用此信息,您可以从原始字符串中提取分隔符:

std::string expression = "1a234bc43";
boost::regex re("[a-z]");
boost::sregex_iterator i(
  expression.begin (),     
  expression.end (),     
  re);
boost::sregex_iterator j;
size_t pos=0;
for(; i!=j;++i) {
  std::string pre_delimiter = expression.substr(pos, (*i).position()-pos); 
  std::cout << pre_delimiter << std::endl;
  std::cout << (*i) << std::endl;
  pos = (*i).position() + (*i).size();
}
std::string last_delimiter = expression.substr(pos);
std::cout << last_delimiter << std::endl;

这个例子会显示:

1

一个

234

b

c

43

b 和 c 之间有一个空字符串,因为没有分隔符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2017-06-16
    • 2011-02-13
    • 2011-11-25
    • 2021-05-08
    相关资源
    最近更新 更多