2017-07-31 77 views
0

我想用boost::sregex_token_iterator解析一個文件。需要支持定義正確的正則表達式

不幸的是,我無法找到正確的正則表達式來提取其中的形式爲FOO:BAR的字符串。只有當每行一個這樣發生難度發現

下面的代碼示例是可用的,但我想,以支持每行本項多,最好也有一個「#」

所以條目等之後評論這

AA:BB CC:DD EE:FF #this is a comment 

應導致3識別標記(AA:BB,CC:DD,EE:FF)

boost::regex re("((\\W+:\\W+)\\S*)+"); 
boost::sregex_token_iterator i(line.begin(), line.end(), re, -1), end; 

for(; i != end; i++){ 
    std::stringstream ss(*i); 
    ... 
} 

任何支持是非常歡迎的。

+0

代碼示例不完整:( – laiki

+1

在正則表達式中不可能擁有可變數量的捕獲組,我要做的就是先用'#'分割並取第一個結果,導致在' #'。然後使用空格分割,這將導致單個對,然後可以使用':'進一步分割。 – SchoolBoy

+0

我同意@SchoolBoy。通過分割可以做什麼應該很少通過正則表達式來完成 –

回答

0

您想匹配1個或更多字詞後跟:,然後再有1個或更多字詞的字符序列。

因此,你需要在調用boost::sregex_token_iterator1更換-1得到組1個文本塊,並取代你與\w+:\w+模式中使用正則表達式:

boost::regex re(R"(#.*|(\w+:\w+))"); 
boost::sregex_token_iterator i(line.begin(), line.end(), re, 1), end; 

注意R"(#.*|(\w+:\w+))"是一個原始字符串文字實際上代表#.*|(\w+:\w+)模式,匹配#,然後該行的其餘部分或將您需要的模式匹配並捕獲到組1中。

請參閱ñstd::regex C++ example(你可以很容易地調整升壓的代碼):

#include <string> 
#include <iostream> 
#include <regex> 
using namespace std; 

int main() { 
    std::regex r(R"(#.*|(\w+:\w+))"); 
     std::string s = "AA:BB CC:DD EE:FF #this is a comment XX:YY"; 
    for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r); 
          i != std::sregex_iterator(); 
          ++i) 
    { 
     std::smatch m = *i; 
     std::cout << m[1].str() << '\n'; 
    } 
    return 0; 
} 
+0

這不符合允許'#'代表註釋的要求 – SchoolBoy

+0

@SchoolBoy它並不是真的必須的,沒有'XX: YY'裏面的評論。 –

+0

但是可能有我的理解。 – SchoolBoy

0

我建議你用拆分來得到你所需要的值。

我會首先使用#進行分割。這將評論與該行的其餘部分分開。然後用空白區分開,將空白區分開。在此之後,可以使用:拆分單個對。

如果出於任何原因必須使用正則表達式,則可以遍歷匹配。在這種情況下我會使用正則表達式如下:

(?:#(?:.*))*(\w+:\w+)\s* 

,直到它找到一個評論此正則表達式將每對匹配。如果有評論,它會跳到下一個新行。

+0

感謝大家的支持。 Wiktor的解決方案非常完美。 – laiki