質問: ファイルで与えられた文章を以下のdelimiterで分割したいと思っています。 period: ., question mark: ? period + double quotation mark: ." question mark + double quotation mark: ?" ``` ifstream s1("filename.txt"); string s2;//格納用のベクトル while (getline(s1, s2, '.')) { sentences.push_back(s2); } ``` とするとperiod . での分割しかすることができません。 ?→. "→space \n→space に置換することも検討したのですが、 ``` replace(s2.begin(), s2.end(),'?', '.'); ``` のようにするとエラーが出てうまくいきません。 解決策わかる方ご教授ください。
回答: こんにちは。 この問題のようにデリミタが複雑な場合にはstd::string::substrなどではソースコードがややこしくなる傾向があります。こんな場合はC++11のを使えばより簡単に解決できます。 ``` vector sentences; string s2; regex del(R"([\.\?]"?)"); while (getline(s1, s2)) { sregex_token_iterator end, tokens(s2.begin(), s2.end(), del, -1); for(;tokens != end; ++tokens) { sentences.push_back(*tokens); } } ``` regex 宣言文以外には普通のC++です。簡単に説明すると \. は 「.」 \? は 「?」 [\.\?] は 「.」もしくは「?」の中で一文字、 "? は 「"」が 1個あるか全然ないという意味です。 そして、getlineにはdelimeter因数はもういらないので削除しました。 最後に、tokensを生成するとき-1を伝達することでdel変数がデリミタとして作動します。 では、楽しいプログラミングの時間になりますように!