2012-05-24 52 views
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_separatorboost::tokenizer正是我需要的。 但我有一個問題吧:

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 
+0

這裏有足夠多的答案:http://stackoverflow.com/questions/1120140/csv-parser-in-c –

回答

2

基本上,你可以使用operator-與字符集匹配:

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

也期待在operator ~反轉字符集。

如果你有興趣逃脫,引號裏的報價,以及,也許在同一時間發表評論的風格,我建議在看看我的答案在這裏:

顯示(部分)CSV文件中的單元格,包括字符串中的轉義引號。

感興趣的其他項目: