gpt4 book ai didi

c++ - Boost Xpressive sregex 分配和捕获组问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:38 25 4
gpt4 key购买 nike

我注意到 boost xpressive sregex 分配中的奇怪行为。请参阅下面的代码。第一个不起作用的代码片段有 sregex 有对象初步分配,然后在主表达式中使用。第二个运行良好的代码片段没有预先分配 sregex(除了最后一个主要的)。如果我错误地使用了 boost xpressive api,请告诉我。

无效的代码

  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;(通过解析)

最佳答案

当您将模式与嵌套的正则表达式匹配时,您会得到嵌套的匹配结果。 This解释一切。

关于c++ - Boost Xpressive sregex 分配和捕获组问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16465628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com