如何使用通配符进行字符串(匹配和替换)?

时间:2011-11-12 16:32:07

标签: c++ string wildcard match

我想搜索一些字母,包括用{+ 1}}替换为C ++中字符串中匹配的字母。

想想像?这样的词。我想找到一个算法,为abcdefgh替换的任何字母搜索输入?c,找到?,同时还要检查bc并查找{ {1}}。

你有什么想法吗?

3 个答案:

答案 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部分中包含两个调用globglobfree

切换到完整正则表达式将允许您使用更多c ++方法,如其他答案中所示。