3

Boostで文字列を正規表現で分割し、区切り文字を結果リストに含めるにはどうすればよいですか?

たとえば、文字列 "1d2" があり、正規表現が "[az]" の場合、(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)); 

ありがとう

4

1 に答える 1

5

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:う

6:ハ

この情報を使用して、元の文字列から区切り記号を抽出できます。

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 の間に空の文字列があります。

于 2009-12-14T18:40:26.627 に答える