2013-07-16 3 views
3

Привет, так что я пытался выяснить, как захватить эти группы должным образом, и я не могу: http://www.debuggex.com/r/xOmFR78EkK3mATN4/0Регулярного выражения захвата повторяющихся групп

В примере мне нужно, чтобы захватить каждую отдельную часть выражения в test1 == 0test2 == 1 и test3 == 2 Прямо сейчас я отвечаю только test1 и test3. Я не могу понять, как я могу правильно подобрать все соответствующие выражения.

Я буду использовать C++ и повысить регулярное выражение, хотя это не должно ничего

ответ

1

Я думаю, что ваш test2 не получает захвачен, потому что это время захвачен группой 7 изменяется, но содержимое группы 7, перезаписываются когда он соответствует test3.

Для повышения регулярного выражения, смотрите документацию для 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 поддерживает. Хорошей новостью является то, что если у вас есть Boost, то выше должно быть просто работать. Xpressive - это библиотека только для заголовков; то есть его не нужно строить.

Вы можете сделать это намного эффективнее с помощью Xpressive's semantic actions. Это не сложнее, но вы отказываетесь от синтаксиса регулярного выражения, с которым вы хорошо знакомы.

Другим вариантом является создание простого анализатора с использованием Boost.Spirit, который также является заголовком.

HTH!

Смежные вопросы