我希望能够在C ++中搜索包括
?
的一些字母,并用字符串匹配的字母替换它们。假设有一个单词abcdefgh
,我想要寻找一种算法来搜索任何字母被?
替换的输入?c
,并找到bc
,同时还应该检查?e?
并找到def
。你有什么想法吗?如果你只想支持?
,那很容易:当你在模式中遇到一个?
时,只需跳过一个字节的输入(或检查isalpha
,如果你真的只想匹配字母)。
编辑:假设更复杂的问题(在输入字符串的任何位置找到匹配项),你可以使用类似于以下代码的代码:
#include <string>
size_t match(std::string const &pat, std::string const &target) {
if (pat.size() > target.size())
return std::string::npos;
size_t max = target.size()-pat.size()+1;
for (size_t start =0; start < max; ++start) {
size_t pos;
for (pos=0; pos < pat.size(); ++pos)
if (pat[pos] != '?' && pat[pos] != target[start+pos])
break;
if (pos == pat.size())
return start;
}
return std::string::npos;
}
#ifdef TEST
#include <iostream>
int main() {
std::cout << match("??cd?", "aaaacdxyz") << "\n";
std::cout << match("?bc", "abc") << "\n";
std::cout << match("ab?", "abc") << "\n";
std::cout << match("ab?", "xabc") << "\n";
std::cout << match("?cd?", "cdx") << "\n";
std::cout << match("??cd?", "aaaacd") << "\n";
std::cout << match("??????", "abc") << "\n";
return 0;
}
#endif
如果你只想基于整个模式是否匹配整个输入来发出是/否的信号,你可以做几乎相同的事情,但是初始化测试使用!=
而不是>
,然后基本上移除外部循环即可。
?abc
与xxxabc
匹配,并告诉你它从第三个位置开始匹配? - Jerry Coffin如果您坚持要在所展示的形式中使用“通配符”,则要搜索的术语是“glob”(至少在类Unix系统上)。
在类Unix系统上,c-centric API 可在 glob.h
中找到,由手册第 3 节中的两个调用 glob
和 globfree
组成。
切换到完整的正则表达式将允许您使用其他答案中显示的更 c++ 的方法。
<regex>
。 - Kerrek SB