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;
    }
  • 相关阅读:
    趋势or过渡,量子点屏幕真的优于OLED?
    文件打开方式设置
    学Arduino 需要做哪些准备?(引自"知乎用户:郑兴芳,DhP"的回答)
    Arduino扫盲(持续添加中)
    订购一套Arduino UNO r3入门套件
    第一次接触Arduino
    关于移动端的事件委托问题
    ASDas
    CentOS利用source命令导入sql文件
    CentOS-LAMP
  • 原文地址:https://www.cnblogs.com/monotone/p/3992791.html
Copyright © 2011-2022 走看看