2014-07-22 33 views
0

我想通過特定字符拆分字符串而不忽略它們。std :: locale通過特定字符拆分字符串而不會忽略它

例如,如果我有字符串:

「some_tag = SOME_VALUE」

我可以使用此語言環境(複製/改編自cppreference)將其分割成標記:

struct split_by_equal : std::ctype<char> 
{ 
    static const mask* make_table() 
    { 
     static std::vector<mask> v(classic_table(), classic_table() + table_size); 
     v['='] |= space; 
     return &v[0]; 
    } 

    split_by_equal() : ctype(make_table()){} 
}; 

... 

std::stringstream stream("some_tag = some_value"); 
stream.imbue(std::locale(std::locale::classic(), new split_by_equal)); 

std::string token; 
while(stream>>token) 
{ 
    std::cout<<token<<std::endl; 
} 

這是有效的,除非我不知道'='是否有一次,多次或缺失。要知道這些信息對驗證輸入字符串非常重要。

是否有可能使解析停止在字符而不從流中提取它?

PS:我想使用std ::區域,因爲真正的問題是沒有分裂只使用「=」作爲分隔符:)字符串作爲簡單

編輯:

我想是能夠以同樣的方式下列字符串解析:

"some_tag=some_value" 
"some_tag 
= 
some_value" 
"some_tag = some_value" 

,並能夠報告在接下來的那些錯誤:

"some_tag some_value" 
"some_tag == some_value" 

回答

0

更新:我最後一個例子沒有考慮到你想處理的其他情況。我測試過的所有的人,他們似乎與這個例子的工作:

template<char c> 
std::istream& strip_until(std::istream& is) 
{ 
    auto& ctype = std::use_facet<std::ctype<char>>(is.getloc()); 
    int val = std::char_traits<char>::to_int_type(c); 
    bool b; 

    while ((b = ctype.is(ctype.space, is.peek())) && is.peek() != val) 
     is.ignore(); 

    if (!b && is.peek() != val) 
     is.setstate(std::ios_base::failbit); 

    return is; 
} 

... 

while (stream >> token >> strip_until<'='>) 
{ 
    // stream.peek() is '=' 
} 
+0

我有一個「some_tag = some_value」的問題。這將被視爲一個沒有方面的字符串。 – Felics

+0

@Felics讓我知道如果我的更新可以幫助請。 – 0x499602D2

+0

@Felics請參閱我的其他更新。 – 0x499602D2

0

您應該使用std::getline與自定義分隔符參數,然後調用(或更多)的默認'\n'。除非您與我們分享完整的問題,否則這仍然是最簡單和最有效的解決方案。

然後你可以檢查你想要處理的任何情況。這將是困難的,雖然來處理這樣的事情:

some_tag 
= 
some_tag = some_value 

這似乎是你可能要處理的情況下,雖然這是非常依賴於你想要什麼解析。

相關問題