gpt4 book ai didi

c++ - boost::regex_search 拒绝接受我的论点

转载 作者:行者123 更新时间:2023-11-28 03:32:11 27 4
gpt4 key购买 nike

我在这方面苦苦挣扎,我已经到了没有取得任何进展的地步,是时候寻求帮助了。我对 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;
}

我正在使用 this example来自 1.47 的 boost 库文档(我正在使用的版本)。有人请向我解释我的用法与这个示例有何不同(除了我没有将东西存储到 map 等中)。

据我所知,我使用的是示例中使用的相同类型的迭代器。然而,当我编译代码时,微软的编译器告诉我:没有重载函数 boost::regex_search 的实例匹配参数列表。然而,智能感知用我正在使用的参数显示了这个函数,尽管迭代器被命名为 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;
}

如果你决定编译,我正在编译和链接 boost 库的 1.47。我正在处理的项目广泛使用了这个版本,更新不是由我决定的。

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

安迪

最佳答案

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

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()

example of work

关于c++ - boost::regex_search 拒绝接受我的论点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12220800/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com