0

我正在尝试用 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 网站上找到的内容对此进行了建模。我使用最后一个示例(在页面底部)作为构建 mf 代码的模板。在这种情况下,文本是字符串类型的对象。

我的正则表达式是否正确?我是否正确使用了 boost?

4

2 回答 2

2

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

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

于 2011-03-09T12:31:46.027 回答
1

您正在为每个 RE 匹配请求第一个子匹配。这指的是这个子表达式:([A-Za-z]|[0-9]|_|-)并且您将获得*每个匹配项的最后一个匹配项(注意它由 a 限定)。因此,最后一个字符。我认为您应该为子匹配号传递 0,或者只是省略该参数。当我修改您的代码以执行此操作时,它会执行我认为您希望它执行的操作。

于 2011-03-09T12:49:24.190 回答