Boost 正则表达式捕获组

5

经过一整天的研究和阅读,我在使用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得到的输出,要注意的是我请求了整行和第一组匹配,同时我还请求了一个“|”以便我们能够轻松地看到行末:

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。 我已经在其他正则表达式解析器上测试过,结果都很好。 请问我在使用boost时做错了什么?
谢谢您!

1
*it++ 应该改为 ++it。但这(可能)不会影响您的结果。 - Alan Stokes
1个回答

1
根据这篇文章,您需要将flag match_not_dot_newline传递给匹配算法。我认为这可以解决您的问题。

使用boost :: regex :: no_mod_s来进行perl操作!我花了一点时间来调试,但最终我终于让它工作了。你只是稍微有点偏差,但非常接近。因为我正在使用perl正则表达式引擎,所以它希望我使用标志的perl选项/版本。(我尝试使用match_not_dot_newline,但它仍然像以前一样行为)。为了强制perl引擎设置该标志,看起来您需要使用boost :: regex :: no_mod_s标志。感谢您的帮助。 - yggdrasil
这是因为这是我第一次接触Boost,也是我第一次尝试在Visual Studio搜索框之外的任何地方使用正则表达式! - Ali1S232

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接