簡體   English   中英

使用多個定界符分割字符串,允許帶引號的值

[英]Splitting string with multiple delimiters, allowing quoted values

boost::escaped_list_separator文檔為第二個參數c提供了以下說明:

字符串c中的任何字符都被視為分隔符。

因此,我需要使用多個分隔符來分割字符串,並允許帶引號的值包含以下分隔符:

#include <iostream>
#include <string>

#include <boost/tokenizer.hpp>

int main() {
    std::wstring str = L"2   , 14   33  50   \"AAA BBB\"";

    std::wstring escSep(L"\\"); //escape character
    std::wstring delim(L" \t\r\n,"); //split on spaces, tabs, new lines, commas
    std::wstring quotes(L"\""); //allow double-quoted values with delimiters within

    boost::escaped_list_separator<wchar_t> separator(escSep, delim, quotes);
    boost::tokenizer<boost::escaped_list_separator<wchar_t>, std::wstring::const_iterator, std::wstring> tok(str, separator);

    for(auto beg=tok.begin(); beg!=tok.end();++beg)
        std::wcout << *beg << std::endl;

    return 0;
}

預期結果將是[2; 14; 33; 50; AAA BBB]。 但是,他的代碼導致一堆空令牌:

在此處輸入圖片說明

考慮所有定界符,常規的boost::char_separator忽略所有這些空標記。 似乎boost::escaped_list_separator也考慮所有指定的定界符,但產生空值。 如果遇到多個連續的定界符,是否會產生空標記,這是真的嗎? 有什么辦法可以避免這種情況?

如果始終都是這樣,那么只會生成空令牌,因此很容易測試結果值並手動忽略它們。 但是,它可能很難看。 例如,假設每個字符串都有2個實際值,並且可能有許多制表符和空格分隔這些值。 然后將分隔符指定為L"\\t " (即空格和制表符)將起作用,但是會產生大量的空標記。

從Boost Tokenizer文檔的判斷來看,您確實是正確的,假設如果遇到多個連續的定界符,則在使用boost::escaped_list_separator時將產生空令牌。 boost::char_separator不同, boost::escaped_list_separator不提供任何允許您傳遞保留還是丟棄所產生的空令牌的構造函數。

當您考慮考慮文檔( http://www.boost.org/doc/libs/1_64_0/libs/tokenizer/escaped_list_separator )中提供的用例(解析CSV文件)時,可以選擇丟棄空令牌。 htm ),保持空令牌是很有意義的。 空字段仍然是字段。

一種選擇是在標記化之后簡單地丟棄空標記。 如果您擔心空令牌的生成,一種替代方法是在將重復的定界符傳遞給令牌生成器之前將其刪除,但是顯然您需要注意不要刪除引號內的任何內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM