<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: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 日本特黄特色免费大片| 午夜视频在线观看免费完整版| 亚洲精品和日本精品| 亚洲AV无码AV男人的天堂不卡| 国国内清清草原免费视频99 | 亚洲AV无码一区二区乱子仑| 思思re热免费精品视频66| 亚洲国产美女视频| AV大片在线无码永久免费| 亚洲av无码不卡久久| 免费看大美女大黄大色| 亚洲AV香蕉一区区二区三区| 亚洲AV伊人久久青青草原| 一级**爱片免费视频| 国产亚洲精品a在线观看app | 色噜噜亚洲男人的天堂| 成人毛片18女人毛片免费视频未| 亚洲码欧美码一区二区三区| 国产免费午夜a无码v视频| 久99久无码精品视频免费播放| 亚洲国产精品VA在线看黑人| 最好看的中文字幕2019免费| 一区二区亚洲精品精华液| 四虎影视永久免费视频观看| 国产又黄又爽又大的免费视频| 亚洲精品免费在线观看| 在线视频免费观看高清| 精品亚洲成a人在线观看| 久久久久亚洲精品天堂久久久久久| 国产免费阿v精品视频网址| 337p日本欧洲亚洲大胆艺术| 女人18特级一级毛片免费视频| 成人免费夜片在线观看| 亚洲日本在线观看| 在线a人片天堂免费观看高清| 免费中文字幕视频| 精品无码一区二区三区亚洲桃色| 四虎影院免费在线播放| 成人网站免费看黄A站视频| 中中文字幕亚洲无线码| 亚洲夜夜欢A∨一区二区三区|