Boost Spirit 电子邮件地址解析器属性生成
Boost Spirit email address parser attribute generation
我正在编写一个包含解析电子邮件地址规则的语法。
规则声明为:
qi::rule<Iterator, ascii::space_type, std::string()> email;
它的定义是:
email
=
qi::lexeme[
+ascii::alnum
>> *(qi::char_(".") >> +ascii::alnum)
>> qi::char_("@")
>> +ascii::alnum
>> +(qi::char_(".") >> +ascii::alnum)
]
当我使用此语法解析文本时,解析器正确匹配了电子邮件地址,但规则的综合属性与正确的地址不对应。例如,如果文本包含地址 info.it@example.com,则合成属性为 info.@example。我认为这是由于 kleen 和 plus 运算符。
我正在使用 boost 1.48,我已经用 boost 1.54 测试了代码,在那个版本中它工作正常,但不幸的是我无法在我的项目中升级到它。
我可以解决这个问题吗,也许使用语义操作?
有意思。
我想这与容器属性如何通过后续容器处理解析器表达式附加到有关。
我不打算安装该库版本,但您可以执行以下操作:
NOTE
your pattern is not for general email addressing.
This is much more complicated in reality. I'm assuming your rule is right for your internal requirements.
Your rule doesn't allow ..
anywhere, right? Assuming this is on purpose too
Your rule doesn't start .
at the start or end of a substring either. Assuming this is on purpose too
删除船长,因为整个规则是一个词位:(参见 Boost spirit skipper issues)
qi::rule<Iterator, std::string()> email;
email =
+ascii::alnum
>> *(qi::char_(".") >> +ascii::alnum)
>> qi::char_("@")
>> +ascii::alnum
>> +(qi::char_(".") >> +ascii::alnum)
;
现在,使用 raw[]
或 as_string[]
来收集整个输入:
qi::rule<Iterator, std::string()> email;
email = qi::as_string [
+ascii::alnum
>> *(qi::char_(".") >> +ascii::alnum)
>> qi::char_("@")
>> +ascii::alnum
>> +(qi::char_(".") >> +ascii::alnum)
];
使用raw[]
你甚至不需要属性捕获使规则更有效和更简单:
qi::rule<Iterator, std::string()> email;
email = qi::raw [
+ascii::alnum >> *('.' >> +ascii::alnum)
>> '@'
>> +ascii::alnum >> +('.' >> +ascii::alnum)
];
我正在编写一个包含解析电子邮件地址规则的语法。 规则声明为:
qi::rule<Iterator, ascii::space_type, std::string()> email;
它的定义是:
email
=
qi::lexeme[
+ascii::alnum
>> *(qi::char_(".") >> +ascii::alnum)
>> qi::char_("@")
>> +ascii::alnum
>> +(qi::char_(".") >> +ascii::alnum)
]
当我使用此语法解析文本时,解析器正确匹配了电子邮件地址,但规则的综合属性与正确的地址不对应。例如,如果文本包含地址 info.it@example.com,则合成属性为 info.@example。我认为这是由于 kleen 和 plus 运算符。
我正在使用 boost 1.48,我已经用 boost 1.54 测试了代码,在那个版本中它工作正常,但不幸的是我无法在我的项目中升级到它。
我可以解决这个问题吗,也许使用语义操作?
有意思。
我想这与容器属性如何通过后续容器处理解析器表达式附加到有关。
我不打算安装该库版本,但您可以执行以下操作:
NOTE
your pattern is not for general email addressing. This is much more complicated in reality. I'm assuming your rule is right for your internal requirements.
Your rule doesn't allow
..
anywhere, right? Assuming this is on purpose tooYour rule doesn't start
.
at the start or end of a substring either. Assuming this is on purpose too
删除船长,因为整个规则是一个词位:(参见 Boost spirit skipper issues)
qi::rule<Iterator, std::string()> email; email = +ascii::alnum >> *(qi::char_(".") >> +ascii::alnum) >> qi::char_("@") >> +ascii::alnum >> +(qi::char_(".") >> +ascii::alnum) ;
现在,使用
raw[]
或as_string[]
来收集整个输入:qi::rule<Iterator, std::string()> email; email = qi::as_string [ +ascii::alnum >> *(qi::char_(".") >> +ascii::alnum) >> qi::char_("@") >> +ascii::alnum >> +(qi::char_(".") >> +ascii::alnum) ];
使用
raw[]
你甚至不需要属性捕获使规则更有效和更简单:qi::rule<Iterator, std::string()> email; email = qi::raw [ +ascii::alnum >> *('.' >> +ascii::alnum) >> '@' >> +ascii::alnum >> +('.' >> +ascii::alnum) ];