<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    導航

    留言簿(1)

    隨筆分類(31)

    文章分類(4)

    收藏夾(21)

    搜索

    •  

    積分與排名

    • 積分 - 29818
    • 排名 - 1390

    最新隨筆

    最新評論

    閱讀排行榜

     
        最常見的通配符是?和*。其中,?可以代表一個字符(不能沒有),*可以代表任意多個字符(可以為空)。
        首先是?,根據?的功能,?表示任意字符,也就是說在匹配過程中,?永遠匹配成功。
    本質上,?并沒有修改算法,而僅僅修改了匹配規則——遇到?則一定匹配。
        然而*與此不同,*的作用是匹配任意多個字符,顯然我們不能簡單的修改匹配過程而滿足要求。如果我們重新思考*的作用,我們會發現*的另一個作用就是分割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 閱讀(3131) 評論(1)  編輯  收藏 所屬分類: C語言算法
     
    Copyright © Dest Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 国产成人高清精品免费软件| 亚洲一区免费在线观看| 免费国产美女爽到喷出水来视频| 亚洲自偷自偷在线成人网站传媒| 成年在线观看网站免费| 亚洲国产成人精品无码区在线秒播| 精品一区二区三区无码免费视频| 亚洲久本草在线中文字幕| 免费A级毛片在线播放| 亚洲精品无码久久毛片波多野吉衣| 毛片无码免费无码播放 | 日韩毛片免费在线观看| 亚洲第一成年网站视频| 四虎永久在线精品视频免费观看| 国产成人亚洲精品电影| 亚洲人成网站在线观看青青| 成av免费大片黄在线观看| 久久久久亚洲AV成人无码| 69成人免费视频| 亚洲AV无码男人的天堂| 亚洲国产精品尤物YW在线观看| 男人和女人高潮免费网站 | 久久亚洲av无码精品浪潮| 野花香高清在线观看视频播放免费| 国产∨亚洲V天堂无码久久久| xxxxwww免费| 亚洲国产精品网站在线播放| 亚洲婷婷国产精品电影人久久| 99久久精品国产免费| 亚洲妇女无套内射精| 亚洲中文字幕无码久久2017| 8x成人永久免费视频| 精品亚洲av无码一区二区柚蜜| 亚洲精品天堂成人片?V在线播放| 日日麻批免费40分钟无码| 亚洲综合无码一区二区痴汉| a级亚洲片精品久久久久久久| 久草视频在线免费| 一级**爱片免费视频| 亚洲成a人片在线观看中文app| 四虎精品亚洲一区二区三区|