使用Boost进行正则表达式标记仅获取最后一个单词

时间:2011-03-09 12:10:08

标签: c++ boost tokenize boost-regex

我试图用Boost解析一个简单的句子结构。这是我第一次使用Boost,所以我可能完全错了。我想要做的只是接受这种格式的字符串:

  • 必须以字母开头(不区分大小写)
  • 可能包含:
    • 字母字符
    • 数字字符
    • 下划线
    • 连字符
  • 所有其他字符用作分隔符

由于我不知道哪些字符是我的分隔符(可能有很多),我试图制作一个对此敏感的正则表达式。唯一的问题是,我只得到每个单词的最后一个字母。这让我相信我的正则表达式是正确的,但我使用boost不是。这是我的代码:

boost::regex regexp("[A-Za-z]([A-Za-z]|[0-9]|_|-)*", boost::regex::normal | boost::regbase::icase);
boost::sregex_token_iterator i(text.begin(), text.end(), regexp, 1);
boost::sregex_token_iterator j;
while(i != j){
    cout << *i++ << std::endl;
}

我在Boost website找到的内容后对此进行了建模。我使用最后一个示例(在页面底部)作为模板来构建mf代码。在这种情况下,text是string类型的对象。

我的正则表达式是否正确?我正确使用提升吗?

2 个答案:

答案 0 :(得分:2)

将您的正则表达式更改为:([A-Za-z][-A-Za-z0-9_]*)

通过将括号放在整个表达式周围,将捕获整个事物,而不仅仅是匹配的最后一个字符。将 - 放在前面会使它成为匹配的字符,而不是范围说明符。

答案 1 :(得分:1)

您正在为每个RE匹配请求第一个子匹配。这指的是这个子表达式:([A-Za-z]|[0-9]|_|-),你得到的每一个匹配的最后一个匹配(注意它由*限定)。因此,最后一个字符。我认为你应该为子匹配号码传递0,或者只是省略该参数。当我修改你的代码来做那件事时,它会做我认为你想要它做的事情。