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

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

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

2020-05-23 14:06:00
字體:
來源:轉載
供稿:網友
本文分別給大家介紹了2個C++在Linux平臺和windows平臺下實現字符串模糊匹配的方法,基本的核心思想都是一樣的,均是使用fnmatch函數,有需要的小伙伴可以參考下。
 

需求:

  準入授權配置文件有時候分了好幾個維度進行配置,例如 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;    }}

結果:   

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

C++,字符串,模糊匹配

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

  time ./fnmatch

C++,字符串,模糊匹配

看來效率還不錯,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;}

輸出如下:

C++,字符串,模糊匹配



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91sao在线观看国产| 国产日韩精品入口| 欧美激情视频给我| 国产亚洲欧洲高清一区| 久久久91精品国产一区不卡| 国产欧美日韩精品在线观看| 欧美三级欧美成人高清www| 96精品视频在线| 亚洲电影免费观看高清完整版在线| 日韩在线高清视频| 亚洲精品日韩久久久| 国产欧亚日韩视频| 成人免费视频网址| 日韩精品电影网| 欧美三级免费观看| 欧美综合国产精品久久丁香| 亚洲最大的av网站| 日韩日本欧美亚洲| 亚洲国产精品中文| 国产精品视频白浆免费视频| 色吧影院999| 国产一区二区在线播放| 性亚洲最疯狂xxxx高清| 欧美国产一区二区三区| 78m国产成人精品视频| 中文字幕在线看视频国产欧美| 美女视频久久黄| 久久久www成人免费精品| 午夜精品久久久久久久99热浪潮| 久久这里有精品| 亚洲人成在线观看| 午夜欧美不卡精品aaaaa| 国产精品扒开腿做爽爽爽视频| 亚洲欧洲av一区二区| 欧美精品第一页在线播放| 国产精品一久久香蕉国产线看观看| 性色av一区二区三区红粉影视| 欧美另类极品videosbestfree| 91在线国产电影| 丰满岳妇乱一区二区三区| 亚洲成人av资源网| 亚洲人成电影网站色…| 在线观看欧美日韩| 欧美人成在线视频| 亚洲精品电影在线| 久久av资源网站| 国产日韩精品综合网站| 中文字幕成人精品久久不卡| 亚洲国产精品va| 国产精品国产三级国产aⅴ浪潮| 日本精品久久中文字幕佐佐木| 91亚洲精品一区二区| 久久久久久久网站| 美女性感视频久久久| 精品视频在线播放| 亚洲午夜小视频| 亚洲第一偷拍网| 免费99精品国产自在在线| 日韩在线观看成人| 亚洲精品自在久久| 日韩亚洲第一页| 国产精品久久一区主播| 欧美黑人巨大精品一区二区| 欧美激情精品久久久久久蜜臀| 精品中文字幕在线| 久久久久久久久久久91| 精品久久久国产| 日韩高清电影免费观看完整| 国产精品一区av| 日韩在线免费视频| 国产91免费看片| 91地址最新发布| 欧美日韩一区二区三区| 亚洲国产成人爱av在线播放| 精品成人乱色一区二区| 国产成人一区二区| 午夜精品国产精品大乳美女| 国产精品久久一区主播| 久久久午夜视频| 亚洲国产私拍精品国模在线观看| 午夜精品久久久久久久男人的天堂| 亚洲视频在线观看| 欧美激情免费看| 亚洲男女性事视频| 欧美成人午夜激情在线| 日韩三级成人av网| 亚洲欧美国内爽妇网| 一本大道香蕉久在线播放29| 神马国产精品影院av| 日韩在线欧美在线国产在线| 欧美老女人xx| 日韩电影网在线| 欧美国产视频一区二区| 91天堂在线视频| 成人激情视频在线| 欧美极品欧美精品欧美视频| 九九热这里只有精品免费看| 亚洲丝袜在线视频| 日本高清+成人网在线观看| 5566成人精品视频免费| 色综合久久久久久中文网| 亚洲精品国产综合区久久久久久久| 黄色一区二区在线观看| 欧美成人sm免费视频| 色爱av美腿丝袜综合粉嫩av| 国产香蕉97碰碰久久人人| 成人激情视频在线播放| 欧美视频免费在线观看| 日韩美女写真福利在线观看| 欧美一级黑人aaaaaaa做受| 国产有码在线一区二区视频| 成人久久久久久| 国产亚洲激情视频在线| 成人做爰www免费看视频网站| 在线观看日韩www视频免费| 88国产精品欧美一区二区三区| 亚洲大胆人体视频| 九九热最新视频//这里只有精品| 欧美日韩人人澡狠狠躁视频| 亚洲第一精品电影| 日韩a**站在线观看| 欧美丝袜第一区| 久久精品2019中文字幕| 91wwwcom在线观看| 国产精品久久久久久久久免费看| 中文字幕久久亚洲| 亚洲免费人成在线视频观看| 欧美一区二区三区精品电影| 日韩av一区二区在线观看| 精品无人国产偷自产在线| 海角国产乱辈乱精品视频| 久久中文精品视频| 亚洲精品永久免费| 国产成人+综合亚洲+天堂| 亚洲高清在线观看| 国产亚洲在线播放| 日韩综合视频在线观看| 日本高清不卡在线| 亚洲成人免费网站| 欧美激情亚洲另类| 欧美高清视频在线| 国产大片精品免费永久看nba| 日韩免费在线视频| 尤物精品国产第一福利三区| 亚洲精品理论电影| 777午夜精品福利在线观看| 亚洲第一精品夜夜躁人人躁| 日韩欧美综合在线视频| 伊人男人综合视频网| 国产精品白丝av嫩草影院| 久久国产精品免费视频| 欧美巨乳在线观看| 66m—66摸成人免费视频| 在线成人激情视频| 97久久精品人人澡人人爽缅北| 欧美激情图片区| 2019中文字幕全在线观看| 色综合天天综合网国产成人网| 亚洲色图五月天| 91精品一区二区| 国产欧美va欧美va香蕉在线| 欧美理论电影在线观看| 国产999精品久久久影片官网| 欧美激情亚洲综合一区|