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

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

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

    LALA  
    日歷
    <2009年6月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

    導航

    留言簿(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: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 5g影院5g天天爽永久免费影院 | 亚洲av中文无码字幕色不卡 | 色噜噜狠狠色综合免费视频| 亚洲综合成人网在线观看| 亚洲视频在线精品| 成年女人18级毛片毛片免费| 美女内射毛片在线看免费人动物| 欧美在线看片A免费观看| 久久A级毛片免费观看| 无码国产精品一区二区免费16| 日韩大片免费观看视频播放| 亚洲欧美日韩综合久久久| 亚洲国产精品久久丫| 亚洲一区二区三区在线网站| 亚洲国产片在线观看| 亚洲中文字幕人成乱码| wwwxxx亚洲| 一级毛片免费播放视频| 久久国产精品免费一区| 中文字幕无码日韩专区免费| 在线观看特色大片免费网站| 777爽死你无码免费看一二区| 免费AA片少妇人AA片直播| 蜜臀91精品国产免费观看| 国产美女亚洲精品久久久综合| 亚洲一区精品无码| 亚洲日本视频在线观看| 亚洲人成未满十八禁网站 | 成人亚洲综合天堂| 亚洲国产精品无码专区在线观看| 噜噜噜亚洲色成人网站∨| 亚洲aⅴ无码专区在线观看春色| 91精品成人免费国产| 国语成本人片免费av无码 | 黄色毛片视频免费| 69pao强力打造免费高清| 亚洲五月午夜免费在线视频| 亚洲成AV人片久久| 男人天堂免费视频| 国产高清在线精品免费软件| 亚洲午夜在线电影|