2011-10-24 75 views
0

首先讓我說,我徹底解決了這個問題的所有其他解決方案,儘管他們非常相似,但是沒有一個能夠完全解決我的問題。Tokenize除引號內的分隔符外的字符串

我需要一個使用boost正則表達式提取除引號之外的所有令牌(對於引用的引用)。

我想我需要使用正則表達式是:

sregex pattern = sregex::compile("\"(?P<token>[^\"]*)\"|(?P<token>\\S+)"); 

,但我得到的錯誤:

命名標誌已經存在

張貼C中的解決方案#似乎使用重複的名稱標記,因爲它是另一個OR表達式。

Regular Expression to split on spaces unless in quotes

回答

3

我回答了一個非常類似的問題在這裏:

How to make my split work only on one real line and be capable to skip quoted parts of string?

的示例代碼

  • 使用升壓精神
  • 支持引用的字符串,部分帶引號的字段,用戶定義的分隔符,轉義引號
  • 一般支持許多(不同的)輸出容器
  • 支持範圍概念作爲輸入的模型(包括炭[],例如)

測試具有相對寬的範圍內的編譯器版本的和Boost版本。

https://gist.github.com/bcfbe2b5f071c7d153a0

0

大多數正則表達式的口味不允許組名被重用。如果所有用途都在相同的變化範圍內,某些口味允許它,但顯然你的不是其中之一。但是,如果您運行的是最新版本的Boost,則應該可以使用分支重置組。它看起來是這樣 - (?|...|...|...) - 並且在每個替代方案中,組編號重置到達分支重置組之前的任何位置。它也應該與命名組合作,但這並不能保證。我不是在一個位置,以測試它自己,所以試試這個:

"(?|\"(?P<token>[^\"]*)\"|(?P<token>\\S+))" 

...如果不工作,與普通的舊數目組嘗試。

+0

這似乎並不工作,我得到一個「無法識別的擴展名」錯誤與使用boost :: xpressive中即使命名商標是正則表達式字符串不同。必須與外部組語法有關。編輯:我的提升是1.47這是最新的,據我所知 –

+0

你有沒有嘗試與編號組? ' 「(|?\」([^ \ 「] *)\」 |(\\ S +))「' –

0

雖然翻翻答案在這裏,我測試了另一種方法,其中包括使用不同組標記的名稱和簡單的測試通過他們進行遍歷時,哪一個是空白的。雖然它可能不是最快的代碼,但它是迄今爲止最可讀的解決方案,這對我的問題更重要。

這裏是爲我工作的代碼:

#include <boost/xpressive/xpressive.hpp> 
    using namespace boost::xpressive; 
... 
    std::vector<std::string> tokens; 
    std::string input = "here is a \"test string\""; 
    sregex pattern = sregex::compile("\"(?P<quoted>[^\"]*)\"|(?P<unquoted>\\S+)"); 
    sregex_iterator cur(input.begin(), input.end(), pattern); 
    sregex_iterator end; 

    while(cur != end) 
    { 
     smatch const &what = *cur; 
     if(what["quoted"].length() > 0) 
     { 
     tokens.push_back(what["quoted"]); 
     } 
     else 
     { 
     tokens.push_back(what["unquoted"]); 
     } 
     cur++; 
    } 
相關問題