• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            飯中淹的避難所~~~~~

            偶爾來避難的地方~

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              94 隨筆 :: 0 文章 :: 257 評論 :: 0 Trackbacks
              1 ///@brief 使用空白字符匹配
              2 #define    USE_WHITE_SPACE_MATCH
              3 
              4 /*!
              5 *    @brief 匹配一個字符串模版
              6 *    @param pszText 需要匹配的字符串
              7 *    @param uTextLen 需要匹配的字符串長度
              8 *    @param pszTemplateText 需要匹配的模版字符串
              9 *    @param uTemplateTextLen 需要匹配的模版字符串的長度
             10 *    @param pMatchedLen 返回的完成匹配的字符串長度
             11 *    @return 返回是否匹配成功
             12 *    @retval true on 匹配成功
             13 *    @retval false on 匹配失敗
             14 */
             15 bool _MatchTemplate( const wchar_t * pszText, size_t uTextLen, const wchar_t * pszTemplateText, size_t uTemplateTextLen, size_t * pMatchedLen )
             16 {
             17 
             18     size_t uTextPos = 0u, uTemplateTextPos = 0u;
             19     size_t uLastStarPos = ~(size_t)0u;
             20 
             21     //    沒有匹配的模版,直接匹配成功
             22     if( uTemplateTextLen == 0 )
             23     {
             24         if( pMatchedLen != NULL )
             25             *pMatchedLen = uTextPos;
             26         return true;
             27     }
             28     whiletrue )
             29     {
             30         wchar_t cTemplate = pszTemplateText[uTemplateTextPos];
             31         switch( cTemplate )
             32         {
             33 #ifdef    USE_WHITE_SPACE_MATCH
             34         case L'.':
             35             {
             36                 if( pszText[uTextPos] != 0x20 &&
             37                     pszText[uTextPos] != 0x3000 )
             38                 {
             39                     if( pMatchedLen != NULL )
             40                         *pMatchedLen = uTextPos;
             41                     return false;
             42                 }
             43                 ++uTemplateTextPos;
             44                 ++uTextPos;
             45             }
             46             break;
             47 #endif
             48         case L'?':
             49             {
             50                 ++uTemplateTextPos;
             51                 ++uTextPos;
             52             }
             53             break;
             54         case L'*':
             55             {
             56                 if( uTemplateTextPos >= uTemplateTextLen-1 )
             57                 {
             58                     //    結(jié)尾的*,直接認為是匹配所有字符(包括空)
             59                     if( pMatchedLen != NULL )
             60                         *pMatchedLen = uTextLen;
             61                     return true;
             62                 }
             63 
             64                 wchar_t cNextTemplate = pszTemplateText[uTemplateTextPos+1];
             65                 //    跳過重復的*
             66                 if( cNextTemplate == '*' )
             67                 {
             68                     ++uTemplateTextPos;
             69                     break;
             70                 }
             71                 //    記錄最后一個*的出現(xiàn)位置
             72                 if( uLastStarPos != uTemplateTextPos )
             73                     uLastStarPos = uTemplateTextPos;
             74                 //    檢查下一個模版字符是否匹配
             75 
             76                 //    ?匹配直接跳過
             77                 if( cNextTemplate == '?' )
             78                 {
             79                     uTemplateTextPos+= 2;
             80                 }
             81 #ifdef    USE_WHITE_SPACE_MATCH
             82                 //    空格匹配
             83                 else if( cNextTemplate == '.' )
             84                 {
             85                     if( pszText[uTextPos] == 0x20 ||
             86                         pszText[uTextPos] == 0x3000 )
             87                     {
             88                         uTemplateTextPos+=2;
             89                     }
             90                 }
             91 #endif
             92                 //    字符匹配
             93                 else if( cNextTemplate == pszText[uTextPos] )
             94                 {
             95                     uTemplateTextPos+=2;
             96                 }
             97                 //    下一個字符
             98                 ++uTextPos;
             99             }
            100             break;
            101         default:
            102             if( cTemplate != pszText[uTextPos] )
            103             {
            104                 //    如果遇到過*就回退到最后一個*
            105                 if( uLastStarPos < uTemplateTextLen )
            106                 {
            107                     uTemplateTextPos = uLastStarPos;
            108                     cTemplate = pszTemplateText[uTemplateTextPos];
            109                     ++uTextPos;
            110                     break;
            111                 }
            112                 if( pMatchedLen != NULL )
            113                     *pMatchedLen = uTextPos;
            114                 return false;
            115 
            116             }
            117             ++uTextPos;
            118             ++uTemplateTextPos;
            119             break;
            120         }
            121         //    成功匹配完城所有的
            122         if( uTemplateTextPos >= uTemplateTextLen )
            123         {
            124             break;
            125         }
            126         //    沒有成功匹配完整個模版,文字就沒有了
            127         if( uTextPos >= uTextLen )
            128         {
            129             if( pMatchedLen != NULL )
            130                 *pMatchedLen = uTextPos;
            131             return false;
            132         }
            133     }
            134     if( pMatchedLen != NULL )
            135         *pMatchedLen = uTextPos;
            136     return true;
            137 }
            138 

            模版支持三種匹配符號 '*','?','.'
            *匹配任意多個任意字符串
            ?匹配一個字符串
            .匹配一個空格
            可以通過注釋掉宏來禁止匹配空格
            達到的效果和文件系統(tǒng)的文件名匹配差不多


            關(guān)于遞歸的方法:
            VCZH提供了一個遞歸的解法,并且“寥寥數(shù)行,瞬間搞定”。
            不過,遞歸會帶來堆棧的問題。
            而且他的方法里存在BUG,我就不貼上來了。
            據(jù)他稱那種方法來自一本 beautiful code的書。此書我沒看過,所以不清楚。
            從他的方法本身看,他只能提供是否匹配的一個結(jié)果,并且匹配模版和待匹配的字符串必須是0結(jié)尾,并且不返回結(jié)束匹配時的匹配進度。
            并且在處理*的時候,有些許小BUG。

            雖然他一直在堅持自己是在做學術(shù)研究,也有不少人匿名來支持他,不過我覺得他還是有些態(tài)度問題。
            總是喜歡在別人的貼上表現(xiàn)自己。做的太過了就是顯擺了。
            從他回帖說的那些話,比如“寥寥數(shù)行,瞬間搞定”這些,以及并不完善的代碼看來,他根本就沒有看過我的代碼,只是憑字面意思就開始貼代碼。
            我實在不清楚他說這些話和貼代碼的原因是什么。這些我就不再討論了,我也刪除了他的回復。
            不過我想說,如果你一直以這種態(tài)度來回別人的帖子,那你會成為一個令人討厭的人。






            posted on 2011-04-27 10:21 飯中淹 閱讀(2425) 評論(6)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)算法分析

            評論

            # re: 【簡單的字符串模版匹配】 2011-04-28 15:22 dfdf
            支持下!  回復  更多評論
              

            # re: 【簡單的字符串模版匹配】 2011-04-29 16:26 臥槽
            嗯,菜鳥一般都有你這樣的自卑心理.  回復  更多評論
              

            # re: 【簡單的字符串模版匹配】 2011-04-29 17:10 飯中淹
            @臥槽
            是的,我確實是個菜鳥。
              回復  更多評論
              

            # re: 【簡單的字符串模版匹配】 2011-04-29 19:51 Kevin Lynx
            @飯中淹
            不要跟連名字都不敢留的人一般見識。  回復  更多評論
              

            # re: 【簡單的字符串模版匹配】 2011-07-27 22:21 請輸入你的姓名
            1. 有沒有非UNICODE版本,畢竟多字節(jié)比較麻煩
            2. 個人感覺沒必要刪除別人的評論吧,寥寥幾行的代碼至少也讓別人能看到,言論自由嗎!!!好壞就由他人評價不行嗎??  回復  更多評論
              

            # re: 【簡單的字符串模版匹配】[未登錄] 2011-08-05 14:04 VK
            //和文件名匹配相似,只支持*和?,無遞歸
            #define FIX_SIZE 1024
            bool _match_fix_size(const wchar_t* src, int srcLen, const wchar_t* rule, int ruleLen)
            {
            // 聲明掃描線并確定新長度
            bool old_scan[FIX_SIZE + 1];
            bool new_scan[FIX_SIZE + 1];
            const int rule_max = ruleLen + 1;
            const int src_max = srcLen + 1;

            //長度不能超過FIX_SIZE
            if (rule_max >= FIX_SIZE || src_max >= FIX_SIZE)
            return false;

            // 復制平移一個位置
            wchar_t src_copy[FIX_SIZE + 1];
            wchar_t rule_copy[FIX_SIZE + 1];
            memcpy(&src_copy[1], src, (srcLen + 1) * sizeof(wchar_t));
            memcpy(&rule_copy[1], rule, (ruleLen + 1) * sizeof(wchar_t));

            //初始化掃描線
            for(int i = 0; i < src_max + 1; ++i)
            {
            new_scan[i] = false;
            old_scan[i] = false;
            }

            // 初始化啟動標記(new_scan無啟動標記)
            src_copy[0] = 0;
            rule_copy[0] = 0;
            old_scan[0] = true; // old_scan 以true開始


            //1才是開始
            for(int i = 1; i < rule_max + 1; ++i)
            {
            for(int j = 1; j < src_max + 1; ++j)
            {
            new_scan[j] = false;
            if(rule_copy[i - 1] == src_copy[j - 1] && old_scan[j - 1])
            new_scan[j] = true;
            if(rule_copy[i - 1] == L'?' && old_scan[j - 1])
            new_scan[j] = true;

            if(rule_copy[i - 1] == L'*')
            {
            if(new_scan[j - 1])
            new_scan[j] = true;
            if(old_scan[j])
            new_scan[j] = true;
            }
            }
            for(int j = 0; j < src_max + 1; ++j)
            old_scan[j] = new_scan[j];
            }
            return new_scan[src_max];
            }

              回復  更多評論
              

            久久久久亚洲精品无码网址| 久久WWW免费人成—看片| 日日狠狠久久偷偷色综合0| 久久99中文字幕久久| 久久ZYZ资源站无码中文动漫| 久久久国产打桩机| 久久精品国产乱子伦| 婷婷五月深深久久精品| 香蕉aa三级久久毛片| 久久亚洲视频| 国内精品人妻无码久久久影院导航 | 伊人久久综合成人网| 久久国产AVJUST麻豆| 亚洲狠狠婷婷综合久久久久 | 国内精品久久久久影院薰衣草| 中文字幕无码免费久久| 国产成人无码久久久精品一| 99久久精品午夜一区二区| 国产成人综合久久精品尤物| 欧美无乱码久久久免费午夜一区二区三区中文字幕| 久久国产精品免费一区| 热99RE久久精品这里都是精品免费 | 久久综合久久自在自线精品自| 99久久精品日本一区二区免费| 韩国三级中文字幕hd久久精品| 性做久久久久久久久老女人| 久久精品无码午夜福利理论片| 热久久这里只有精品| 成人久久免费网站| 国产成人综合久久久久久| 精品国产乱码久久久久软件| 久久成人精品视频| 少妇人妻综合久久中文字幕| 99久久久精品| 99精品国产综合久久久久五月天 | 久久精品综合网| 精品久久久久久综合日本| 久久人妻AV中文字幕| 久久精品亚洲福利| 久久久噜噜噜久久中文福利| 色偷偷88欧美精品久久久 |