zoukankan      html  css  js  c++  java
  • 带’*’号字符串的匹配

    目标:

    判断源字符串中是否含有指定子串,子串可能会有*号通配符。

    初步测试没问题。记录下来。后面要是有问题再来纠正。

    #include <string>
    using namespace std;
    
    // 带*号通配符的字符串匹配,'*'代表任意字符串,包括空字符串
    bool WildcardCaptureA(const char* lpszSour, const char* lpszMatch)
    {
        bool lbRet = false;
        do 
        {
            const char* lpszSrcStr = lpszSour;
            const char* lpszMatchStr = lpszMatch;
    
            // 不用比较的条件
            if(NULL == lpszSrcStr || 0 == lpszSrcStr[0]
                || NULL == lpszMatchStr || 0 == lpszMatchStr[0])
                break;
    
            // 排除首部的*号
            while('*' == lpszMatchStr[0])++lpszMatchStr;
            if(0 == lpszMatchStr[0])        // 全是*号,则认为任何字符串都匹配
            {
                lbRet = true;
                break;
            }
    
            string loStrWord;    
            // 取出第一个子串
            while('*' != lpszMatchStr[0] && 0 != lpszMatchStr[0])
            {
                loStrWord.push_back(lpszMatchStr[0]);
                ++lpszMatchStr;
            }
    
            // 匹配
            lpszSrcStr = strstr(lpszSrcStr, loStrWord.c_str());
            if(NULL == lpszSrcStr)
                break;
    
            // 继续匹配
            if(0 != lpszMatchStr[0] && false == WildcardCaptureA(++lpszSrcStr, lpszMatchStr))
                break;
    
            lbRet = true;
        } while (false);
        return lbRet;
    }
    
    
    // 带*号通配符的字符串匹配,'*'代表任意字符串,包括空字符串
    bool WildcardCaptureW(const wchar_t* lpszSour, const wchar_t* lpszMatch)
    {
        bool lbRet = false;
        do 
        {
            const wchar_t* lpszSrcStr = lpszSour;
            const wchar_t* lpszMatchStr = lpszMatch;
    
            // 不用比较的条件
            if(NULL == lpszSrcStr || 0 == lpszSrcStr[0]
            || NULL == lpszMatchStr || 0 == lpszMatchStr[0])
                break;
    
            // 排除首部的*号
            while('*' == lpszMatchStr[0])++lpszMatchStr;
            if(0 == lpszMatchStr[0])        // 全是*号,则认为任何字符串都匹配
            {
                lbRet = true;
                break;
            }
    
            wstring loStrWord;    
            // 取出第一个子串
            while('*' != lpszMatchStr[0] && 0 != lpszMatchStr[0])
            {
                loStrWord.push_back(lpszMatchStr[0]);
                ++lpszMatchStr;
            }
    
            // 匹配
            lpszSrcStr = wcsstr(lpszSrcStr, loStrWord.c_str());
            if(NULL == lpszSrcStr)
                break;
    
            // 继续匹配
            if(0 != lpszMatchStr[0] && false == WildcardCaptureW(++lpszSrcStr, lpszMatchStr))
                break;
    
            lbRet = true;
        } while (false);
        return lbRet;
    }
  • 相关阅读:
    QWidget在QPopupMenu显示
    QTable中header高度
    在OpenSSL中添加自定义加密算法
    LibXML2不支持中文补遗
    基于arm+uClinux的嵌入式系统的开发
    关于嵌入式系统的启动
    在Qt/Embedded 2.3.8中添加MX21Ads键盘处理
    QT/Embedded 2.3.8 MX21ADS板移植
    Windows/Linux/Solaris 软中断处理机制
    RMI原理及实现
  • 原文地址:https://www.cnblogs.com/monotone/p/3992791.html
Copyright © 2011-2022 走看看