Я замечаю странное поведение в назначениях ускорения 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;
(проходит синтаксический)
В нем говорится: «У автора нет способа узнать, будет ли внутреннее регулярное выражение топать вектор подгонки или нет». Так в чем же решение? Используя regex_match() или regex_search(), match_results <> ??? – enthusiasticgeek
Прочтите документы! Это все. Если вы используете regex_match или regex_search, все обратные ссылки сохраняются, но вы должны искать нужное место, которое в этом случае будет в коллекции, возвращенной match_results :: nested_results. Но серьезно. Прочтите документы. –