4

文字列連結式を見つけるパーサーを作成します。主に関数呼び出しに由来する、括弧で囲まれた一連の文字列があります。

たとえば("one"+"two"+"three") -> ("one"|"two"|"three")、簡単なケースで、私はそれを処理できます。

より難しいケースは(null, "one"+"two"+"three", null) -> (null, "one"|"two"|"three", null)ですが、 で解析できますboost::tokenizer

(null, "one"+"two"+"three,four", 1 /* third parameter can be: 1, 2, 3 */)、このような難しい例では、構文解析をお勧めしますがboost::spirit、いくつかのルールを書くのに助けが必要です.

後で:

escaped_list_separatorからのようboost::tokenizerです私が必要なものです。しかし、私はそれに1つの問題があります:

   using namespace std;
   using namespace boost;
   string s = "Field 1,\"putting quotes around fields, allows commas\",Field 3";
   tokenizer<escaped_list_separator<char> > tok(s,escaped_list_separator<char>("", ",", "\""));
   for(tokenizer<escaped_list_separator<char> >::iterator beg=tok.begin(); beg!=tok.end();++beg){
       cout <<"~~~"<< *beg << "\n";
   }

私のために削除"します。このように出力に引用符を保持することは可能です

Field 1
"putting quotes around fields, allows commas"
Field 3
4

1 に答える 1

2

operator-基本的に、文字セットの一致で使用できます。

   rule = '"' >> (char_ - '"') >> '"';

operator ~文字セットを反転することも確認してください。

引用符内の引用符をエスケープすることに興味があり、同時にスタイルにコメントすることに興味がある場合は、ここで私の答えを確認することをお勧めします。

文字列内のエスケープされた引用符を含む、CSVファイル内の(部分的に)引用符で囲まれたセルの表示。

その他の関心のある項目:

于 2012-05-24T09:55:28.357 に答える