我的功能如下:
bool ExpandWildCard(vector<string>& names, vector<string>& result, string& wildcard)
{
}
在这里,我想将wildcard
与向量names
中的每个元素进行匹配,如果匹配,则将names
中的元素添加到result
向量中
当然,如果通配符是*,我可以添加从names
到results
的所有内容。此外,我现在只是尝试实施*
通配符。
如何在C ++中执行此操作?
我想到这样做的一种方法是使用find()
算法,但我不确定我是否会使用它来匹配通配符?
答案 0 :(得分:1)
看起来您正在寻找std::copy_if和std::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;
}