【问题标题】:boost regular expression capture groups提升正则表达式捕获组
【发布时间】:2011-09-02 23:01:19
【问题描述】:

经过一天的黑客和阅读,我对 boost 的正则表达式引擎没有运气,希望这里有人可以提供帮助。

我想从最后一个字段匹配某些输入的每一行中获取第一个字段。

string input =
    "449 a dingo ate my baby THING\n"
    "448 a dingo ate my baby THING\n"
    "445 a dingo ate my baby BOOGNISH\n"
    "446 a dingo ate my baby BOOGNISH\n"
    "447 a dingo ate my baby STUFF\n";

假设我给我的正则表达式以下字符串...

string re = "^([0-9]+).+?boognish$";
boost::regex expression(re,boost::regex::perl | boost:regex::icase);

然后设置我的比赛

const int subs[] = { 0, 1 };
boost::sregex_token_iterator it(input.begin(), input.end(), expression, subs);
boost::sregex_token_iterator end;

while ( it != end )

{
    fprintf(stderr,"%s|\n", it->str().c_str());
    *it++;
}

这是我从 boost 中得到的输出,请记住,我要求了整条线和第 1 组比赛,我还要求了“|”所以我们可以很容易地看到行尾:

449     a dingo ate my baby         THING
448     a dingo ate my baby        THING
445     a dingo ate my baby         BOOGNISH|
449|
446     a dingo ate my baby         BOOGNISH|
446|

我真的很想要445|和 446|只是,但它给了我 449(直到它达到第一个 BOOGNISH),然后是 446。我已经在其他重新解析器上测试过它,它似乎工作正常。我做错了什么提升?

提前谢谢你!

【问题讨论】:

  • *it++ 应该是 ++it。但这(可能)不会影响您的结果。

标签: c++ regex boost boost-regex


【解决方案1】:

根据this articale,您必须将flag match_not_dot_newline 传递给匹配算法。我认为这会解决你的情况。

【讨论】:

  • 对 perl 使用 boost::regex::no_mod_s!我花了一些时间修修补补,但我终于让它工作了。你只是一点,但真的很接近。因为我使用的是 perl 正则表达式引擎,所以它希望我使用标志的 perl 选项/版本。 (我尝试只使用 match_not_dot_newline,但它的行为仍然像以前一样)。要强制 perl 引擎设置该标志,您似乎需要使用 boost::regex::no_mod_s 标志。感谢您的帮助。
  • 那是因为这是我第一次遇到 boost 并且我第一次尝试在 Visual Studio 搜索框以外的任何地方使用正则表达式!
猜你喜欢
  • 2014-05-28
  • 2019-02-22
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多