C++ boost : Split String

标签 c++ regex string boost tokenize

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

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

我有:

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)); 

谢谢

最佳答案

我认为您不能使用 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 : a

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

a

234

b

c

43

由于没有分隔符,b和c之间是一个空字符串。

关于C++ boost : Split String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1897261/

相关文章:

c++ - 返回类型中不需要模板参数

c++ - 创建对 vector 的问题

python - python 中的 re.sub 有时不起作用

python 常规如何将点与字母匹配?

javascript - 正则表达式选择两个字符串之间的所有内容,但不选择其中一个字符串

java - 从 android 向 servlet 发送一个字符串

css - css 属性 "top"是 javascript 中的字符串还是数字?

c++ - 从 C++ 发送 MIDI 消息

c++ - 如何拆分一个超大类?

C# 文本对齐