模式匹配向量中的每个元素

时间:2014-08-04 14:02:45

标签: c++ regex glob

我的功能如下:

bool ExpandWildCard(vector<string>& names, vector<string>& result, string& wildcard) 
{
}

在这里,我想将wildcard与向量names中的每个元素进行匹配,如果匹配,则将names中的元素添加到result向量中

当然,如果通配符是*,我可以添加从namesresults的所有内容。此外,我现在只是尝试实施*通配符。

如何在C ++中执行此操作?

我想到这样做的一种方法是使用find()算法,但我不确定我是否会使用它来匹配通配符?

2 个答案:

答案 0 :(得分:1)

看起来您正在寻找std::copy_ifstd::regex_match的某种组合:

bool ExpandWildCard(vector<string>& names, vector<string>& result, string& wildcard) {
  auto oldsize = result.size();
  std::copy_if(std::begin(names), std::end(names),
    std::back_inserter(result),
    [&](string const& name) {
      return std::regex_match(name, make_regex(wildcard));
    }
  );

  return (result.size() > oldsize);
}

make_regex是将字符串转换为std::regex时需要实现的功能。

答案 1 :(得分:0)

another answer中建议您使用regex_match时可能采用的方法。 Elsewhere您可以找到将glob模式转换为正则表达式的代码。

如果性能不是问题,并且您只需要该功能,则可以使用shell来匹配模式。您可以创建一个合适的命令,通过popen()传递命令并读取结果并将它们存储在矢量中。

bool ExpandWildCard (const std::vector<std::string>& names,
                     std::vector<std::string>& result,
                     const std::string& wildcard)
{
    std::ostringstream oss;
    oss << "bash -c 'for word in ";
    for (int i = 0; i < names.size(); ++i) {
        if (names[i].size() > 0) oss << '"' << names[i] << '"' << ' ';
    }
    oss << "; do case \"$word\" in "
        << wildcard << ')' << " echo \"$word\" ;; *) ;; "
        << "esac ; done '";
    FILE *fp = ::popen(oss.str().c_str(), "r");
    if (fp == NULL) return false;
    char *line = 0;
    ssize_t len = 0;
    size_t n = 0;
    while ((len = ::getline(&line, &n, fp)) > 0) {
        if (line[len-1] == '\n') line[len-1] = '\0';
        result.push_back(line);
    }
    ::free(line);
    ::pclose(fp);
    return true;
}