如何使用通配符来匹配和替换字符串?

3
我希望能够在C ++中搜索包括?的一些字母,并用字符串匹配的字母替换它们。假设有一个单词abcdefgh,我想要寻找一种算法来搜索任何字母被?替换的输入?c,并找到bc,同时还应该检查?e?并找到def。你有什么想法吗?

1
听起来是一个很好的正则表达式案例,现在已经成为标准库中的一部分 <regex> - Kerrek SB
3个回答

2
如何使用boost::regex?或者如果您使用的是启用了c++11编译器,则可以使用std::regex。

实际上,我正在使用Xcode。有没有更好的方法使用字符串函数(如substr等)? - Yagiz
完整的模式匹配不容易实现,但如果您只需要'?',那么它会容易得多。 - Inbae Jeong

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

如果你只想基于整个模式是否匹配整个输入来发出是/否的信号,你可以做几乎相同的事情,但是初始化测试使用!=而不是>,然后基本上移除外部循环即可。


@Alex:你是想让它只有在模式与整个字符串匹配时才发出信号,还是希望(例如)?abcxxxabc匹配,并告诉你它从第三个位置开始匹配? - Jerry Coffin

0

如果您坚持要在所展示的形式中使用“通配符”,则要搜索的术语是“glob”(至少在类Unix系统上)。

在类Unix系统上,c-centric API 可在 glob.h 中找到,由手册第 3 节中的两个调用 globglobfree 组成。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接