嗨所以我一直在試圖找出如何正確地捕捉到這些羣體,我不能:http://www.debuggex.com/r/xOmFR78EkK3mATN4/0正則表達式捕捉重複組
在這個例子中,我需要捕獲表達的每個部件在test1 == 0
test2 == 1
和test3 == 2
現在我只匹配test1和test3我無法弄清楚如何能夠正確匹配所有匹配的表達式。
我將使用C++和提高正則表達式,但應該不會改變任何東西
嗨所以我一直在試圖找出如何正確地捕捉到這些羣體,我不能:http://www.debuggex.com/r/xOmFR78EkK3mATN4/0正則表達式捕捉重複組
在這個例子中,我需要捕獲表達的每個部件在test1 == 0
test2 == 1
和test3 == 2
現在我只匹配test1和test3我無法弄清楚如何能夠正確匹配所有匹配的表達式。
我將使用C++和提高正則表達式,但應該不會改變任何東西
我覺得你的test2的是沒有得到捕獲,因爲它是由7組抓獲,但第7組中的內容被覆蓋掉了當它匹配test3時。
對於boost正則表達式,請參閱match_flag_type
的文檔,特別是match_extra
。
您可以使用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!
好啊,廢話我不能這樣做,因爲圖書館的方式。它沒有匹配額外啓用 – csteifel
@legion嗯,這是艱難的,但不是不可能的。你注意到你的正則表達式的那部分是怎樣的一個循環?您應該可以在代碼中實現循環,並執行多次正則匹配或搜索,每次都會更改起始位置。 –