2013-07-16 120 views
3

嗨所以我一直在試圖找出如何正確地捕捉到這些羣體,我不能:http://www.debuggex.com/r/xOmFR78EkK3mATN4/0正則表達式捕捉重複組

在這個例子中,我需要捕獲表達的每個部件在test1 == 0test2 == 1test3 == 2現在我只匹配test1和test3我無法弄清楚如何能夠正確匹配所有匹配的表達式。

我將使用C++和提高正則表達式,但應該不會改變任何東西

回答

1

我覺得你的test2的是沒有得到捕獲,因爲它是由7組抓獲,但第7組中的內容被覆蓋掉了當它匹配test3時。

對於boost正則表達式,請參閱match_flag_type的文檔,特別是match_extra

+0

好啊,廢話我不能這樣做,因爲圖書館的方式。它沒有匹配額外啓用 – csteifel

+0

@legion嗯,這是艱難的,但不是不可能的。你注意到你的正則表達式的那部分是怎樣的一個循環?您應該可以在代碼中實現循環,並執行多次正則匹配或搜索,每次都會更改起始位置。 –

1

您可以使用Boost.Xpressive此:

#include <iostream> 
#include <boost/xpressive/xpressive.hpp> 

using namespace boost::xpressive; 

int main() 
{ 
    std::string str("testrule: test1 == 0 && test2 == 1 && test3 == 2 ; test desc"); 

    sregex_compiler comp; 
    regex_constants::syntax_option_type x = regex_constants::ignore_white_space; 
    comp.compile("(? $test =)(([\\w\\.]+)\\s+(==|!=|>|<)\\s+([\\w\\.]+))", x); 
    sregex test = comp.compile("^(\\w+):\\s+(? $test)(\\s&&\\s(? $test))*\\s*;\\s*(.*)$", x); 

    smatch what; 
    if(regex_match(str, what, test)) 
    { 
     for(smatch const & nested : what.nested_results()) 
      std::cout << nested[0].str() << std::endl; 
    } 
} 

該程序打印如下:

test1 == 0 
test2 == 1 
test3 == 2 

它使戰略性地利用nested dynamic regexes,我不相信Boost.Regex支持。好消息是,如果你有提升,上述應該只是工作。 Xpressive是一個只有標題的庫;也就是說,它不需要建立。

使用Xpressive的semantic actions可以使此效率更高。這並不難,但是放棄了很多您熟悉的正則表達式語法。

另一種選擇是使用Boost.Spirit構建簡單的解析器,該解析器也僅用於標題。

HTH!