<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)

    搜索

    •  

    積分與排名

    • 積分 - 30061
    • 排名 - 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 閱讀(3139) 評論(1)  編輯  收藏 所屬分類: C語言算法
     
    Copyright © Dest Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 亚洲精品无码激情AV| 成人a免费α片在线视频网站| 亚洲高清无码专区视频| 激情小说亚洲色图| 亚洲Av无码国产情品久久| 免费观看又污又黄在线观看| 亚洲高清免费视频| 精品乱子伦一区二区三区高清免费播放 | 黄色免费网址大全| 亚洲精品A在线观看| 岛国岛国免费V片在线观看| 国产亚洲成AV人片在线观黄桃| 久久精品免费观看| 亚洲美女人黄网成人女| 黄页网站在线看免费| 亚洲色偷偷偷综合网| 免费v片在线观看无遮挡| 中文字幕免费观看视频| 亚洲视频在线观看| 成人免费无码大片a毛片| 黄色网址免费在线| 亚洲va无码专区国产乱码| 7x7x7x免费在线观看| 亚洲国产精品无码中文lv | 国产V亚洲V天堂无码| 91成人免费观看| 亚洲精品V天堂中文字幕| 亚洲国产成人五月综合网 | 777亚洲精品乱码久久久久久 | 最近最好的中文字幕2019免费| 亚洲精品又粗又大又爽A片| 亚洲日韩国产一区二区三区| 秋霞人成在线观看免费视频 | 亚洲成AV人网址| 免费毛片a线观看| 亚洲经典千人经典日产| 亚洲乱码中文字幕久久孕妇黑人| 精品国产sm捆绑最大网免费站| 亚洲av无码专区在线电影天堂| 人人狠狠综合久久亚洲婷婷| 毛片免费在线播放|