質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

6738閲覧

C++ 文字列の分割 複数種のデリミター

for

総合スコア6

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2017/11/10 18:51

ファイルで与えられた文章を以下の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(),'?', '.');

のようにするとエラーが出てうまくいきません。

解決策わかる方ご教授ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。

この問題のようにデリミタが複雑な場合にはstd::string::substrなどではソースコードがややこしくなる傾向があります。こんな場合はC++11の<regex>を使えばより簡単に解決できます。

vector<string> 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変数がデリミタとして作動します。

では、楽しいプログラミングの時間になりますように!

投稿2017/11/25 15:30

編集2017/11/25 15:33
gazette2

総合スコア179

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

std::getlineが複数のデリミタに対応していればよいのですが、対応していないようです。また、以前探したことがありますが、同じ目的で使えるものも見つかりませんでした。

ですので、すっぱり諦めてget()で1文字づつ処理しながら、.?の時は、それまで貯めた文字列をsentencesへpush_backし、次の文字をpeek()で覗いて、"だったら破棄して処理継続で良いと思います。
これくらいのコードなら下手に技巧を凝らすより分かりやすいと思います。

投稿2017/11/11 02:19

編集2017/11/11 02:20
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問