【问题标题】:How to use C++ Boost's regex_iterator()如何使用 C++ Boost 的 regex_iterator()
【发布时间】:2010-04-07 14:31:46
【问题描述】:

我正在使用 Boost 来匹配字符串中的子字符串。 io迭代结果,我需要使用regex_iterator()

这是我找到的唯一用法示例,但我不明白回调。有人可以给我一个函数的例子吗?


假设我的输入文本是:

"Hello everybody this is a sentense
Bla bla 14 .. yes 
date 04/15/1986 
"

我想得到:

"Hello" "everybody" "this" "is" "a" "sentense" "bla" "yes" "date"

【问题讨论】:

    标签: c++ regex boost iterator


    【解决方案1】:

    如果您不理解的示例中唯一的部分是回调,请考虑:

    std::for_each(m1, m2, &regex_callback);
    

    大致相当于:

    for (; m1 != m2; ++m1){
        class_index[(*m1)[5].str() + (*m1)[6].str()] = (*m1).position(5);
    }
    

    假设在您的情况下,您想将所有匹配项存储在一个向量中,您可以编写如下内容:

    //Warning, untested:
    boost::sregex_iterator m1(text.begin(), text.end(), expression);
    boost::sregex_iterator m2;
    std::vector<std::string> tokens;
    for (; m1 != m2; ++m1){
        tokens.push_back(m1->str()).
    }
    

    【讨论】:

      【解决方案2】:

      根据您的解释,您可以使用分词器功能。 并在其中加入更多逻辑。 看boost::tokenizer

      例如:

      boost::char_separator<char> sep_1(" ");
      
      
      std::string msg_copy ("Hello everybody this is a sentense Bla bla 14 .. yes date 04/15/1986 ");
      boost::tokenizer< boost::char_separator<char> > tokens(msg_copy, sep_1);
      BOOST_FOREACH(std::string t, tokens)
      {
              // here you itterate t
      }
      

      编辑:

      您可以在分隔符中添加任意数量的特殊字符,例如:

      boost::char_separator<char> sep_1(" *^&%~/|");
      

      【讨论】:

      • 是的,这是一个可能的解决方案,但我忘了提到我真正想要获取的文本包含由空格、逗号、破折号、管道分隔的单词。最好是使用正则表达式。 . boost 是 C++ 的最佳选择。我曾尝试使用 Boost::regex_search() 但它只返回第一个匹配项.. 我需要获取所有匹配项.. 为此我被告知使用 boost::regex_iterator() 但我什么都不理解 Boost 的文档真的糟透了……
      • 然后使用: boost::char_separator sep_1(" *^&%~/|");它将针对所有特殊字符进行标记化;)帖子也已更新
      猜你喜欢
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      相关资源
      最近更新 更多