【问题标题】:Boost Spirit email address parser attribute generationBoost Spirit 电子邮件地址解析器属性生成
【发布时间】:2015-03-26 09:57:47
【问题描述】:

我正在编写一个包含解析电子邮件地址规则的语法。 规则声明为:

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 测试了代码,并且在该版本中它可以正常工作,但不幸的是我无法在我的项目中升级到它。

我可以解决这个问题,也许使用语义操作?

【问题讨论】:

    标签: c++ parsing boost boost-spirit


    【解决方案1】:

    有趣。

    我想这与后续容器处理解析器表达式如何附加到容器属性的变化有关。

    我不打算安装那个库版本,但是你可以做一些事情:

    注意

    • 您的模式不适用于一般电子邮件地址。 这在现实中要复杂得多。我假设您的规则适合您的内部要求。

    • 您的规则不允许在任何地方使用..,对吗?假设这也是故意的

    • 您的规则也不会在子字符串的开头或结尾处以 . 开头。假设这也是故意的

    1. 删除船长,因为整个规则是一个词位:(参见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)
              ;
      
    2. 现在,使用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)
      ];
      
    3. 使用raw[],您甚至不需要捕获属性,从而使规则更加高效和简单:

      qi::rule<Iterator, std::string()> email;
      
      email = qi::raw [
             +ascii::alnum >> *('.' >> +ascii::alnum)
          >> '@'
          >> +ascii::alnum >> +('.' >> +ascii::alnum)
      ];
      

    【讨论】:

    • 谢谢,你猜对了,解析器适合我的应用程序。我测试了您的解决方案并在使用 raw[] 时完美运行,但是解决方案 #2 不起作用,它仍然会产生类似 info.@example 的输出。
    • @giulatona 是的,这有点道理。不过值得一试。就像我说的,我还没有安装超过 3 年的 boost 版本来测试该方法:) 使用更高版本的 boost,它们都可以工作
    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    相关资源
    最近更新 更多