LALA  
          日歷
          <2011年7月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導航

          留言簿(1)

          隨筆分類(31)

          文章分類(4)

          收藏夾(21)

          搜索

          •  

          積分與排名

          • 積分 - 29910
          • 排名 - 1389

          最新隨筆

          最新評論

          閱讀排行榜

           
              最常見的通配符是?和*。其中,?可以代表一個字符(不能沒有),*可以代表任意多個字符(可以為空)。
              首先是?,根據?的功能,?表示任意字符,也就是說在匹配過程中,?永遠匹配成功。
          本質上,?并沒有修改算法,而僅僅修改了匹配規則——遇到?則一定匹配。
              然而*與此不同,*的作用是匹配任意多個字符,顯然我們不能簡單的修改匹配過程而滿足要求。如果我們重新思考*的作用,我們會發現*的另一個作用就是分割P串,即如果P=P1*P2,那么與其說*代表匹配任意多個字符,不如說P的匹配條件是在匹配P1子串后再匹配P2子串。
              因此,可以寫出帶通配符的字符串匹配算法。
           1 // 樸素字符串匹配
           2 // @param src - 待匹配的字符串
           3 // @param pattern - 模式字符串
           4 bool match(const char* src, const char* pattern)
           5 {
           6     if(src == NULL || pattern == NULL)    return false;
           7 
           8     if(*pattern == '\0')
           9         if(*src == '\0')
          10             return true;
          11         else 
          12             return false;
          13     else if(*src == '\0')
          14         return false;
          15 
          16     int srcLen = strlen(src);
          17     int patternLen = strlen(pattern);
          18     if(patternLen > srcLen)
          19         return false;
          20     int i = 0, j = 0;
          21     while(i < srcLen - patternLen && j < patternLen)
          22     {
          23         if(src[i + j] == pattern[j])
          24         {
          25             j++;
          26         }else
          27         {
          28             i++;
          29             j = 0;
          30         }
          31     }
          32     if( j == patternLen)
          33         return true;
          34     return false;
          35 }
          36 
          37 // 帶通配符的字符串匹配
          38 // @param src - 待匹配的字符串
          39 // @param pattern - 模式字符串
          40 // 使用了偽遞歸,容易改成迭代形式
          41 bool match2(const char* src, const char* pattern)
          42 {
          43     if(src == NULL || pattern == NULL)    return false;
          44 
          45     if(*pattern == '\0')
          46         return true;
          47     if(*src == '\0')
          48         return false;
          49 
          50     // 去除開頭的'*'
          51     const char* tmp_pat = pattern;
          52     while (*tmp_pat && *tmp_pat == '*') tmp_pat++;
          53 
          54     int srcLen = strlen(src);    
          55     int patternLen = strlen(tmp_pat);
          56     if(patternLen > srcLen)
          57         return false;
          58     // 開始匹配,包括'?'的任意匹配,直到遇到模式中的'*'或匹配完為止。
          59     int i = 0,j = 0;
          60     while(i < srcLen - patternLen && j < patternLen && tmp_pat[j] != '*')
          61     {
          62         if(tmp_pat[j] == '?' || src[i+j] == tmp_pat[j])
          63             j++;
          64         else{
          65             j = 0;
          66             i++;
          67         }
          68     }
          69     // 匹配成功
          70     if(j == patternLen)
          71         return true;    
          72     // 遇到'*',開始下一次匹配
          73     if (tmp_pat[j] == '*')
          74     {
          75         i+=j;
          76         return match2(src + i, tmp_pat + j);        
          77     }    
          78     
          79     return false;    
          80 }
          81 
          82 int main()
          83 {
          84     char* src = "wo shi yi ge zhong guo ren";
          85     char* pat = "shi";
          86     if (match(src, pat))
          87     {
          88         cout<<"match1\n";
          89     }
          90     char* pat2 = "*sh*?*";
          91     if (match2(src, pat2))
          92     {
          93         cout<<"match2\n";
          94     }
          95 }
          96 

          posted on 2009-06-16 01:02 Dest 閱讀(3134) 評論(1)  編輯  收藏 所屬分類: C語言算法
           
          Copyright © Dest Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 泗水县| 博爱县| 萨迦县| 湘阴县| 双柏县| 黄平县| 德兴市| 周口市| 达日县| 界首市| 谢通门县| 北宁市| 合川市| 迁安市| 洞口县| 五寨县| 台安县| 天门市| 龙门县| 东平县| 彭泽县| 岳阳县| 东丰县| 灌南县| 扬中市| 黄大仙区| 闽清县| 抚顺县| 伊宁县| 炎陵县| 乳山市| 永年县| 堆龙德庆县| 固始县| 巴林右旗| 囊谦县| 永和县| 肃北| 突泉县| 曲阜市| 民和|