<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: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 亚洲一区二区三区无码影院| 免费女人高潮流视频在线观看| 爽爽日本在线视频免费| 亚洲av无码片在线观看| 野花高清在线观看免费完整版中文 | 日韩亚洲变态另类中文| www免费黄色网| 亚洲人成图片小说网站| 国产高清不卡免费视频| 久久久久亚洲AV无码麻豆| 18禁男女爽爽爽午夜网站免费| 亚洲精品中文字幕麻豆| A级毛片内射免费视频| 亚洲av无码无线在线观看| 又粗又大又长又爽免费视频| 亚洲精品偷拍视频免费观看| 国产AV无码专区亚洲AV男同| 18禁美女黄网站色大片免费观看 | 亚洲黄色免费网站| 国产1024精品视频专区免费 | 精品国产污污免费网站入口在线| 国产午夜亚洲精品午夜鲁丝片| 野花香在线视频免费观看大全 | 在线观看永久免费| 亚洲AV无码一区二区大桥未久| 亚洲日本中文字幕天堂网| 久久大香香蕉国产免费网站| 亚洲制服丝袜精品久久| 国产成人精品男人免费| 拍拍拍无挡免费视频网站| 亚洲精品在线网站| 免费在线黄色网址| 久99久精品免费视频热77| 亚洲丁香婷婷综合久久| 亚洲中文字幕在线第六区| 18禁美女黄网站色大片免费观看 | 亚洲韩国精品无码一区二区三区| 国产电影午夜成年免费视频| 日韩大片免费观看视频播放| 亚洲今日精彩视频| 亚洲av日韩av欧v在线天堂|