2013-05-09 1 views
2

Я замечаю странное поведение в назначениях ускорения xpressive sregex. См. Код ниже. Первый фрагмент кода, который не работает, имеет sregex имеет предварительные назначения объекта, а затем используется в основном выражении позже. Второй фрагмент кода, который работает хорошо, не имеет предварительных назначений sregex (кроме финального основного). Пожалуйста, дайте мне знать, если я неправильно использую boost xpressive api.Boost Xpressive sregex присвоение и группа захвата

код, который не работает

mark_tag Value1(1), Value2(2), Value3(3), Value4(4), Value5(5), Value6(6), Value7(7); 
    boost::xpressive::sregex name,multicast,rtsp; 

    name = ((Value1 = (+boost::xpressive::set[_w|_d|'-'|'_'|as_xpr(' ')])) >> ','); 

    name1 = 
     ((Value2 = icase(as_xpr("mark1:"))) 
    >> (Value3 = (+boost::xpressive::set[_d|'.'])) 
    >> ':' 
    >> (Value4 = (+boost::xpressive::set[_d])) >> optional(as_xpr(","))); 

    name2 = 
     ((Value5 = icase(as_xpr("mark2:"))) 
    >> (Value6 = (+boost::xpressive::set[_d|'.'])) 
    >> ':' 
    >> (Value7 = (+boost::xpressive::set[_d])) >> optional(as_xpr(","))) ; 

    boost::xpressive::sregex pt = bos 
    >> (
    name 
    >> repeat<0,2>(
    name1 
    | 
    name2) 
    ) 
    >> eos; 


    boost::trim(string_to_parse); 
    smatch what; 
    if (!regex_search(string_to_parse, what, pt)) { 
     std::stringstream ss; 
     ss << "Unable to parse: " << string_to_parse; 
     throw parse::MyException(ss.str()); 
    } 

    std::string Value1_str = what[Value1]; // print them later 
    std::string Value2_str = what[Value2]; // print them later 
    std::string Value3_str = what[Value3]; // print them later 
    std::string Value4_str = what[Value4]; // print them later 
    std::string Value5_str = what[Value5]; // print them later 
    std::string Value6_str = what[Value6]; // print them later 
    std::string Value7_str = what[Value7]; // print them later 

string_to_parse = NameX,mark1:192.168.1.100:5555,mark2:192.168.1.101:5556; (сбой синтаксического анализа) Значение, что [<>] не содержит никакого значения.

код, который работает

mark_tag Value1(1), Value2(2), Value3(3), Value4(4), Value5(5), Value6(6), Value7(7); 
    sregex pt = bos 
    >> (
    ((Value1 = (+boost::xpressive::set[_w|_d|'-'|'_'|as_xpr(' ')])) >> ',') 
    >> repeat<0,2>(
    ((Value2 = icase(as_xpr("mark1:"))) >> (Value3 = (+boost::xpressive::set[_d|'.'])) >> ':' >> (Value4 = (+boost::xpressive::set[_d])) >> optional(as_xpr(","))) 
    | 
    ((Value5 = icase(as_xpr("mark2:"))) >> (Value6 = (+boost::xpressive::set[_d|'.'])) >> ':' >> (Value7 = (+boost::xpressive::set[_d])) >> optional(as_xpr(",")))) 
    ) 
    >> eos; 

    boost::trim(string_to_parse); 
    smatch what; 
    if (!regex_search(string_to_parse, what, pt)) { 
     std::stringstream ss; 
     ss << "Unable to parse: " << string_to_parse; 
     throw parse::MyException(ss.str()); 
    } 

    std::string Value1_str = what[Value1]; // print them later 
    std::string Value2_str = what[Value2]; // print them later 
    std::string Value3_str = what[Value3]; // print them later 
    std::string Value4_str = what[Value4]; // print them later 
    std::string Value5_str = what[Value5]; // print them later 
    std::string Value6_str = what[Value6]; // print them later 
    std::string Value7_str = what[Value7]; // print them later 

string_to_parse = NameX,mark1:192.168.1.100:5555,mark2:192.168.1.101:5556; (проходит синтаксический)

ответ

2

Когда вы подходите шаблон с вложенными регулярными выражениями, вы получите вложенные результаты матча. This объясняет все это.

+0

В нем говорится: «У автора нет способа узнать, будет ли внутреннее регулярное выражение топать вектор подгонки или нет». Так в чем же решение? Используя regex_match() или regex_search(), match_results <> ??? – enthusiasticgeek

+1

Прочтите документы! Это все. Если вы используете regex_match или regex_search, все обратные ссылки сохраняются, но вы должны искать нужное место, которое в этом случае будет в коллекции, возвращенной match_results :: nested_results. Но серьезно. Прочтите документы. –