亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C/C++實現字符串模糊匹配

2020-01-26 14:39:23
字體:
來源:轉載
供稿:網友

需求:

  準入授權配置文件有時候分了好幾個維度進行配置,例如 company|product|sys這種格式的配置:

1.配置 "sina|weibo|pusher" 表示 sina公司weibo產品pusher系統能夠準入,而"sina|weibo|sign"不允許準入

2.配置 "sina|*|pusher” 表示sina公司所有產品的pusher系統都能夠準入

3.配置 “*|*|pusher” 表示所有公司的所有產品的pusher系統都能夠準入

  …

  類似還有很多場景,好了,簡單的東西不扯蛋了.

實現:

  面對這個需求我第一時間想的是如何設計模式串,如何快速實現功能,因為我現在寫的是一個C服務,所以我首先出現在我腦海的是一大堆strchr(XXX, ‘*'), strchr(XXX, ‘|')等等東西,后面發現這個東西沒有必要自己造輪子,有現成的函數可以用,那就是fnmatch.

  google了一下,發現fnmatch的資料并不是很多,大部分還都是講php函數的,所以沒辦法,只能自己寫寫測測了.

#include <iostream>#include <fnmatch.h>#include <vector>using namespace std; int main(){  const char* orgin_str = "sina|weibo|pusher";  char pattern_arr[][20] = {    {"sina|*|pusher"},    {"sina|*|*"},    {"*|weibo|*"},    //不能被匹配的    {"sina|pic|*"},    {"*|*|sign"},    {"*|weibo|sign"},    {"*|pic|sign"},    {"sina|pic|sign"},     {"*|*|*"}  };  static int pattern_arr_size = sizeof(pattern_arr) / sizeof(pattern_arr[0]);   vector<char *> vec_str;  for(int i = 0; i < pattern_arr_size; i ++)  {    vec_str.push_back(pattern_arr[i]);  }   int ret;  int z = 0;  while(z < 1){    for(int i = 0; i < vec_str.size(); i++)    {         ret = fnmatch(vec_str.at(i), orgin_str, FNM_PATHNAME);      if(FNM_NOMATCH == ret){        cout<<"sorry I'm failed ["<< vec_str.at(i) <<"]"<<endl;      }       }       ++z;    }}

結果:   

  實驗一把,結果還不賴,完全滿足需求:

  需求滿足了,我擔心的還有一個問題,那就是性能,注釋掉cout輸出,將while z語句調至1,000,000,重新編譯跑一下:

  time ./fnmatch

看來效率還不錯,2.1s 進行了100W次匹配,平均2us一次,性能要求也滿足了...

附:上面文章只介紹了在Linux系統下直接調用系統函數fnmatch即可實現,而沒有考慮在Windows在的使用。

本人這周看了下Google-glog代碼,恰巧發現了一個類似fnmatch的簡單實現,因此綜合起來提供了一個跨平臺的接口。

#ifdef OS_WINDOWS/* Bits set in the FLAGS argument to `fnmatch'. copy from fnmatch.h(linux) */#define  FNM_PATHNAME  (1 << 0) /* No wildcard can ever match `/'. */#define  FNM_NOESCAPE  (1 << 1) /* Backslashes don't quote special chars. */#define  FNM_PERIOD    (1 << 2) /* Leading `.' is matched only explicitly. */#define  FNM_NOMATCH    1#define fnmatch fnmatch_win/**copy from Google-glog*/bool SafeFNMatch(const char* pattern,size_t patt_len,const char* str,size_t str_len){  size_t p = 0;  size_t s = 0;  while (1)  {    if (p == patt_len && s == str_len)      return true;    if (p == patt_len)      return false;    if (s == str_len)      return p+1 == patt_len && pattern[p] == '*';    if (pattern[p] == str[s] || pattern[p] == '?')    {      p += 1;      s += 1;      continue;    }    if (pattern[p] == '*')    {      if (p+1 == patt_len) return true;      do      {        if (SafeFNMatch(pattern+(p+1), patt_len-(p+1), str+s, str_len-s))        {          return true;        }        s += 1;      } while (s != str_len);      return false;    }    return false;  }}/**注意:Windows平臺下尚未實現最后一個參數flags的功能?。?!*/int fnmatch_win(const char *pattern, const char *name, int flags = 0){  if(SafeFNMatch(pattern,strlen(pattern),name,strlen(name)))    return 0;  else    return FNM_NOMATCH;}#else#include <fnmatch.h>#endifint main(){  const char* orgin_str = "sina|weibo|pusher";  char pattern_arr[][20] = {    {"sina|*|pusher"},    {"sina|*|*"},    {"*|weibo|*"},    //不能被匹配的    {"sina|pic|*"},    {"*|*|sign"},    {"*|weibo|sign"},    {"*|pic|sign"},    {"sina|pic|sign"},    {"*|*|*"}  };  static int pattern_arr_size = sizeof(pattern_arr) / sizeof(pattern_arr[0]);  vector<char *> vec_str;  for(int i = 0; i < pattern_arr_size; i ++)  {    vec_str.push_back(pattern_arr[i]);  }  std::cout << "Origin Str: " << orgin_str << "/n/n";  int ret;  for(int i = 0; i < vec_str.size(); i++)  {    ret = fnmatch(vec_str.at(i), orgin_str, FNM_PATHNAME);    if(ret == FNM_NOMATCH)    {      cout<<"sorry, I'm failed: ["<< vec_str.at(i) <<"]/n";    }    else    {      cout<<"OK, I'm success: ["<< vec_str.at(i) <<"]/n";    }  }  return 0;}

輸出如下:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜剧场成人观在线视频免费观看| 欧美成人手机在线| 欧美在线视频一区| 5252色成人免费视频| 国产欧美va欧美va香蕉在| 久久99国产精品自在自在app| 青草青草久热精品视频在线网站| 亚洲一区二区三区sesese| 欧美成人手机在线| 97超级碰碰人国产在线观看| 国产精品久久97| 亚洲xxxx3d| 国产精品久久久久久av下载红粉| 国产一区红桃视频| 日韩在线观看免费av| 亚洲欧美另类人妖| 欧美激情视频网站| 91九色在线视频| www.欧美视频| 国产精品美女www| 国产精品久久久久aaaa九色| 欧美在线精品免播放器视频| 成人免费看吃奶视频网站| 中文在线不卡视频| 欧美日韩国产精品一区二区三区四区| 亚洲精品动漫久久久久| 日韩精品一区二区视频| 日本中文字幕成人| 18一19gay欧美视频网站| 亚洲精品视频免费| 日韩欧美成人免费视频| 欧美精品在线看| 国产精品亚洲综合天堂夜夜| 欧美肥臀大乳一区二区免费视频| 91在线视频精品| 欧美劲爆第一页| 亚洲精品中文字幕av| 理论片在线不卡免费观看| 91精品久久久久久| 国产成人精品在线视频| 国语自产精品视频在线看抢先版图片| 日韩av影视在线| 国产成人精品日本亚洲专区61| 免费av一区二区| 91久久精品国产91久久性色| 精品在线欧美视频| 欧美午夜精品久久久久久浪潮| 蜜臀久久99精品久久久无需会员| 久久人人爽国产| 91精品国产91久久久久久吃药| 成人免费淫片视频软件| www.久久草.com| 亚洲免费一在线| 精品国产乱码久久久久久天美| 欧美一区二区三区精品电影| 国产精品av在线播放| 九九热精品视频国产| 91精品国产自产91精品| 国产精品 欧美在线| 亚洲裸体xxxx| 日韩视频免费看| 国产一区二区三区视频| 久久av红桃一区二区小说| 日韩av在线不卡| 国产一区私人高清影院| 在线亚洲男人天堂| 亚洲精品v欧美精品v日韩精品| 久久精品久久久久电影| 国产精品视频久| 91丨九色丨国产在线| 国产欧美最新羞羞视频在线观看| 国产精品美女久久久久久免费| 国产精品伦子伦免费视频| 欧美日韩国产黄| 亚洲精品一区二区久| 成人a在线视频| 国产欧美日韩亚洲精品| 国产z一区二区三区| 亚洲最大的av网站| 热99在线视频| 欧美巨大黑人极品精男| 国产精品∨欧美精品v日韩精品| 成人免费福利在线| 97精品伊人久久久大香线蕉| 精品国产网站地址| 中文字幕亚洲一区| 欧美一级淫片videoshd| 中文字幕亚洲自拍| 日韩精品极品在线观看播放免费视频| 精品国产区一区二区三区在线观看| 欧美视频在线免费看| 成人疯狂猛交xxx| 国内免费精品永久在线视频| 国产精品国模在线| 亚洲国产精品字幕| 国产成人精品综合| 91高清免费在线观看| 91av在线视频观看| 69精品小视频| 日韩av网站导航| 亚洲性av网站| 亚洲最大福利网| 高清欧美性猛交xxxx| 中文国产成人精品| 成人在线视频网站| 亚洲mm色国产网站| 国产一区二区黄| 亚洲一区二区三区777| 亚洲奶大毛多的老太婆| 一本大道亚洲视频| 国产99久久精品一区二区 夜夜躁日日躁| 性欧美激情精品| 麻豆成人在线看| 日韩av在线高清| 在线电影欧美日韩一区二区私密| 欧美日韩中文字幕在线视频| 国产91ⅴ在线精品免费观看| 久久亚洲一区二区三区四区五区高| 欧美午夜丰满在线18影院| 亚洲激情小视频| 亚洲人成网站色ww在线| 日韩美女视频在线观看| 久久综合免费视频| 这里只有精品久久| 国产精品网红直播| 国产99久久精品一区二区 夜夜躁日日躁| 国产精品第8页| 狠狠色狠狠色综合日日五| 日韩精品在线免费观看视频| 国产免费亚洲高清| 久久中国妇女中文字幕| 亚洲第一页中文字幕| 国产91色在线免费| 亚洲精品成人av| 国产精品羞羞答答| 国产成人自拍视频在线观看| 欧美精品久久久久久久| 亚洲偷欧美偷国内偷| 国产午夜精品全部视频在线播放| 亚洲free性xxxx护士hd| 精品久久久在线观看| 搡老女人一区二区三区视频tv| 亚洲欧美日韩一区二区在线| 色婷婷av一区二区三区久久| 国产在线精品自拍| 久久精品91久久久久久再现| 国产精品福利在线观看| 97视频国产在线| 在线播放日韩精品| 欧美电影免费观看高清完整| 亚洲黄在线观看| 国产精品久久久久秋霞鲁丝| 国产成人免费91av在线| 成人网页在线免费观看| 久久久久久久久久久国产| 国产精品亚洲精品| 国产在线观看不卡| 57pao成人国产永久免费| 日韩av在线天堂网| 国产欧美va欧美va香蕉在线| 国产成人一区二区三区电影| 欧美日韩国产精品一区二区不卡中文| 国产精品一区=区| 欧美成年人在线观看|