boost :: regex_search拒绝接受我的论点

时间:2012-08-31 18:31:08

标签: c++ boost

我正在努力解决这个问题,而且我还没有取得任何进展,现在是时候寻求帮助了。我对boost库的熟悉程度仅略高于肤浅。我正在尝试通过一个相当大的字符串进行逐行扫描。实际上,它是读入std :: string对象的文件的全部内容(文件不会那么大,它是命令行程序的输出)。

该程序的输出pnputil是重复的。我正在寻找某些模式,以找到我想要的“oemNNN.inf”文件。本质上,我的算法是找到第一个“oemNNN.inf”,搜索识别该文件的特征。如果它不是我想要的那个,那么继续下一个。

在代码中,它类似于:

std::string filesContents;
std::string::size_type index(filesContents.find_first_of("oem"));
std::string::iterator start(filesContents.begin() + index);
boost::match_results<std::string::const_iterator> matches;
while(!found) {
    if(boost::regex_search(start, filesContents.end(), matches, re))
    {
        // do important stuff with the matches
        found = true; // found is used outside of loop too
        break;
    }

    index = filesContents.find_first_of("oem", index + 1);
    if(std::string::npos == index) break;
    start = filesContents.being() + index;
}

我正在使用1.47(我正在使用的版本)的boost库文档中的this example。有人请向我解释一下我的用法与这个例子的不同之处(除了我没有将东西存储到地图等中这一事实)。

据我所知,我使用的是示例使用的相同类型的迭代器。然而,当我编译代码时,Microsoft的编译器告诉我:没有重载函数boost :: regex_search的实例匹配参数列表。然而,intellisense使用我正在使用的参数显示此函数,尽管迭代器被命名为BidiIterator。我不知道这个的意义,但是举个例子,我假设无论BidiIterator是什么,它都需要一个std :: string :: iterator来构造(也许是一个不好的假设,但似乎有意义,因为例)。该示例确实显示了第五个参数match_flags,但该参数默认为值:boost :: match_default。因此,它应该是不必要的。然而,只是为了踢和笑,我已经添加了第五个参数,但它仍然不起作用。我如何滥用这些论点?特别是在考虑这个例子时。

下面是一个简单的程序,它在没有循环算法的情况下演示了这个问题。

#include <iostream>
#include <string>

#include <boost/regex.hpp>

int main() {
std::string haystack("This is a string which contains stuff I want to find");
boost::regex needle("stuff");

boost::match_results<std::string::const_iterator> what;
if(boost::regex_search(haystack.begin(), haystack.end(), what, needle, boost::match_default)) {
    std::cout << "Found some matches" << std::endl;
    std::cout << what[0].first << std::endl;
}

return 0;
}

如果您决定编译,我正在编译并链接到1.47的boost库。我正在使用的项目广泛使用这个版本,更新不是我决定的。

感谢您的帮助。这是最令人沮丧的。

安迪

1 个答案:

答案 0 :(得分:2)

一般来说,迭代器的类型是不同的。

std::string haystack("This is a string which contains stuff I want to find");

begin()end()返回的值为std::string::iterator。 但你的匹配类型是

boost::match_results<std::string::const_iterator> what;

std::string::iteratorstd::string::const_iterator是不同的类型。 所以变种很少

  1. 将字符串声明为const(即const std::string haystack;
  2. 将迭代器声明为const_iterators(即std::string::const_iterator begin = haystack.begin(), end = haystack.end();)并将它们传递给regex_search
  3. 使用boost::match_results<std::string::iterator> what;
  4. 如果您使用的是C ++ 11,则可以使用haystack.cbegin()haystack.cend()
  5. example of work