我想搜索一些字母,包括用{+ 1}}替换为C ++中字符串中匹配的字母。
想想像?
这样的词。我想找到一个算法,为abcdefgh
替换的任何字母搜索输入?c
,找到?
,同时还要检查bc
并查找{ {1}}。
你有什么想法吗?
答案 0 :(得分:2)
使用boost :: regex怎么样?或者std :: regex如果您正在使用启用了c ++ 11的编译器。
答案 1 :(得分:1)
如果您只想支持?
,那就非常简单了:当您在模式中遇到?
时,只需跳过一个字节的输入(或检查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
如果您只想根据整个模式是否与整个输入相匹配来发出“是/否”信号,那么您可以做同样的事情,但使用!=
而不是>
进行初始测试,然后基本上删除外循环。
答案 2 :(得分:0)
或者,如果您在表单中坚持使用“通配符”,则表示您要搜索的术语是“glob”(至少在类Unix系统上)。
以c {为中心的API可以在类似unix的系统上的glob.h
中找到,并且在手册的第3部分中包含两个调用glob
和globfree
。
切换到完整正则表达式将允许您使用更多c ++方法,如其他答案中所示。