找到字母子字符串

时间:2013-06-27 14:12:26

标签: c++ regex gcc c++11 substring

我有以下字符串,我想从中提取大于1的字母部分(字母子字符串):

  • %d。 i.p.p. attendu - > attendu
  • après。专业知识 - > apr,专业知识
  • n.c.p.c。 condamner - > condamner

我正在尝试以下代码:

#include <regex>
#include <iostream>
void main()
{
    const std::string s = "% d. i.p.p. attendu";
    std::regex rgx("[a-zA-Z]{2,20}");
    std::smatch match;

    if (std::regex_search(s.begin(), s.end(), match, rgx))
        std::cout << "match: " << match[1] << '\n';
} 

但是当我运行代码时出现以下错误: 在抛出'std :: regex_error'的实例后终止调用what():regex_error

你能帮帮我吧 谢谢, 哈尼。

好吧我设法使用提升,因为gcc的正则表达式是憎恶

#include <boost/regex.hpp>

void main()
{
        const std::string s = "% d. i.p.p. tototo attendu";
        boost::regex re("[a-zA-Z]{4,7}");
        boost::smatch matches;
        if( boost::regex_search( s, matches, re ) )
         {
               std::string value( matches[0].first, matches[0].second );
                cout << value << "  ";
          }
}

很好,我找到了atte,但输出只是tototo。它没有递增

返回值是“tototo attendu”我想知道我是否可以一次返回每个值而不是1个字符串

1 个答案:

答案 0 :(得分:1)

  

我想知道我是否可以一次返回每个值而不是1个字符串

这样做的唯一方法似乎是通过regex_iterator。以下是使用Boost的示例:

#include <boost/regex.hpp>
#include <iostream>

int main() {
    const std::string s = "% d. i.p.p. tototo attendu";
    boost::regex rgx("([a-zA-Z]{2,20})");
    boost::smatch match;

    boost::sregex_iterator begin{s.begin(), s.end(), rgx},
                           end{};

    for (auto&& i = begin; i != end; ++i)
        std::cout << "match: " << *i << '\n';
}

这会产生:

match: tototo
match: attendu

两件事:

  • main的返回类型始终 int。你的代码甚至不应该编译。
  • 我在你的(首先,这是正确的!)正则表达式周围添加了括号,以便为每个匹配创建一个捕获。迭代器然后依次迭代每个匹配。