C++实现的字符串模糊匹配

  C++基本没有正则表达式功能,当然像Boost里提供了正则。本文来源于博客园园友的一篇文章,请看:
  
  C/C++ 字符串模糊匹配
  
  很早之前就看过这篇文章,原作者的需求很明确、代码实现也很好。
  
  之所以又写这篇文章,是因为原作者只介绍了在Linux系统下直接调用系统函数fnmatch即可实现,而没有考虑在Windows在的使用。
  
  本人这周看了下Google-glog代码,恰巧发现了一个类似fnmatch的简单实现,因此综合起来提供了一个跨平台的接口。
  
  直接拿原作者的需求为例(再次感谢原作者大熊先生,我这是拿来主义了):
  
  需求:
  
  准入授权配置文件有时候分了好几个维度进行配置,例如 company|product|sys这种格式的配置:
  
  1.配置 "sina|weibo|pusher" 表示 sina公司weibo产品pusher系统能够准入,而"sina|weibo|sign"不允许准入
  
  2.配置 "sina|*|pusher” 表示sina公司所有产品的pusher系统都能够准入
  
  3.配置 “*|*|pusher” 表示所有公司的所有产品的pusher系统都能够准入
  
  代码实现如下:
  
  mamicode.com,码迷
  
  1 #ifdef OS_WINDOWS
  
  2 /* Bits set in the FLAGS argument to `fnmatch‘. copy from fnmatch.h(linux) */
  
  3 #define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/‘. */
  
  4 #define FNM_NOESCAPE (1 << 1) /* Backslashes don‘t quote special chars. */
  
  5 #define FNM_PERIOD (1 << 2) /* Leading `.‘ is matched only explicitly. */
  
  6 #define FNM_NOMATCH 1
  
  7
  
  8 #define fnmatch fnmatch_win
  
  9
  
  10 /**copy from Google-glog*/
  
  11 bool SafeFNMatch(const char* pattern,size_t patt_len,const char* str,size_t str_len)
  
  12 {
  
  13 size_t p = 0;
  
  14 size_t s = 0;
  
  15 while (1)
  
  16 {
  
  17 if (p == patt_len && s == str_len)
  
  18 return true;
  
  19 if (p == patt_len)
  
  20 return false;
  
  21 if (s == str_len)
  
  22 return p+1 == patt_len && pattern[p] == ‘*‘;
  
  23 if (pattern[p] == str[s] || pattern[p] == ‘?‘)
  
  24 {
  
  25 p += 1;
  
  26 s += 1;
  
  27 continue;
  
  28 }
  
  29 if (pattern[p] == ‘*‘)
  
  30 {
  
  31 if (p+1 == patt_len) return true;
  
  32 do
  
  33 {
  
  34 if (SafeFNMatch(pattern+(p+1), patt_len-(p+1), str+s, str_len-s))
  
  35 {
  
  36 return true;
  
  37 }
  
  38 s += 1;
  
  39 } while (s != str_len);
  
  40
  
  41 return false;
  
  42 }
  
  43
  
  44 return false;
  
  45 }
  
  46 }
  
  47
  
  48 /**注意:Windows平台下尚未实现最后一个参数flags的功能!!!*/
  
  49 int fnmatch_win(const char *pattern, const char *name, int flags = 0)
  
  50 {
  
  51 if(SafeFNMatch(pattern,strlen(pattern),name,strlen(name)))
  
  52 return 0;
  
  53 else
  
  54 return FNM_NOMATCH;
  
  55 }
  
  56
  
  57 #else
  
  58 #include <fnmatch.h>
  
  59 #endif
  
  60
  
  61 int main()
  
  62 {
  
  63 const char* orgin_str = "sina|weibo|pusher";
  
  64 char pattern_arr[][20] = {
  
  65 {"sina|*|pusher"},
  
  66 {"sina|*|*"},
  
  67 {"*|weibo|*"},
  
  68 //不能被匹配的
  
  69 {"sina|pic|*"},
  
  70 {"*|*|sign"},
  
  71 {"*|weibo|sign"},
  
  72 {"*|pic|sign"},
  
  73 {"sina|pic|sign"},
  
  74
  
  75 {"*|*|*"}
  
  76 };
  
  77 static int pattern_arr_size = sizeof(pattern_arr) / sizeof(pattern_arr[0]);
  
  78
  
  79 vector<char *> vec_str;
  
  80 for(int i = 0; i < pattern_arr_size; i ++)
  
  81 {
  
  82 vec_str.push_back(pattern_arr[i]);
  
  83 }
  
  84
  
  85 std::cout << "Origin Str: " << orgin_str << "\n\n";
  
  86 int ret;
  
  87 for(int i = 0; i < vec_str.size(); i++)
  
  88 {
  
  89 ret = fnmatch(vec_str.at(i), orgin_str, FNM_PATHNAME);
  
  90 if(ret == FNM_NOMATCH)
  
  91 {
  
  92 cout<<"sorry, I‘m failed: ["<< vec_str.at(i) <<"]\n";
  
  93 }
  
  94 else
  
  95 {
  
  96 cout<<"OK, I‘m success: ["<< vec_str.at(i) <<"]\n";
  
  97 }
  
  98 }
  
  99
  
  100 return 0;
  
  101 }
  
  mamicode.com,码迷
  
  完整代码请看:字符串模糊匹配(fnmatch).cpp。输出如下:
  
  mamicode.com,码迷

https://www.cnblogs.com/zhenhua1618/category/1731527.html
https://www.cnblogs.com/zhenhua1618/category/1731528.html
https://www.cnblogs.com/zhenhua1618/category/1731531.html
https://www.cnblogs.com/zhenhua1618/category/1731532.html
https://www.cnblogs.com/zhenhua1618/category/1731533.html
https://www.cnblogs.com/zhenhua1618/category/1731534.html
https://www.cnblogs.com/zhenhua1618/category/1731536.html
https://www.cnblogs.com/zhenhua1618/category/1731538.html
https://www.cnblogs.com/zhenhua1618/category/1731540.html
https://www.cnblogs.com/zhenhua1618/category/1731543.html
https://www.cnblogs.com/zhenhua1618/category/1731545.html
https://www.cnblogs.com/zhenhua1618/category/1731547.html
https://www.cnblogs.com/zhenhua1618/category/1731550.html
https://www.cnblogs.com/zhenhua1618/category/1731552.html
https://www.cnblogs.com/zhenhua1618/category/1731555.html
https://www.cnblogs.com/zhenhua1618/category/1731557.html
https://www.cnblogs.com/zhenhua1618/category/1731560.html
https://www.cnblogs.com/zhenhua1618/category/1731562.html
https://www.cnblogs.com/zhenhua1618/category/1731564.html
https://www.cnblogs.com/zhenhua1618/category/1731567.html
https://www.cnblogs.com/zhenhua1618/category/1731569.html
https://www.cnblogs.com/zhenhua1618/category/1731571.html
https://www.cnblogs.com/zhenhua1618/category/1731574.html
https://www.cnblogs.com/zhenhua1618/category/1731576.html
https://www.cnblogs.com/zhenhua1618/category/1731579.html
https://www.cnblogs.com/zhenhua1618/category/1731580.html
https://www.cnblogs.com/zhenhua1618/category/1731582.html
https://www.cnblogs.com/zhenhua1618/category/1731586.html
https://www.cnblogs.com/zhenhua1618/category/1731589.html
https://www.cnblogs.com/zhenhua1618/category/1731591.html
https://www.cnblogs.com/zhenhua1618/category/1731594.html
https://www.cnblogs.com/zhenhua1618/category/1731596.html
https://www.cnblogs.com/zhenhua1618/category/1731600.html
https://www.cnblogs.com/zhenhua1618/category/1731602.html
https://www.cnblogs.com/zhenhua1618/category/1731604.html
https://www.cnblogs.com/zhenhua1618/category/1731607.html
https://www.cnblogs.com/zhenhua1618/category/1731609.html
https://www.cnblogs.com/zhenhua1618/category/1731611.html
https://www.cnblogs.com/zhenhua1618/category/1731614.html
https://www.cnblogs.com/zhenhua1618/category/1731616.html
https://www.cnblogs.com/zhenhua1618/category/1731620.html
https://www.cnblogs.com/zhenhua1618/category/1731622.html
https://www.cnblogs.com/zhenhua1618/category/1731624.html
https://www.cnblogs.com/zhenhua1618/category/1731627.html
https://www.cnblogs.com/zhenhua1618/category/1731629.html
https://www.cnblogs.com/zhenhua1618/category/1731631.html
https://www.cnblogs.com/zhenhua1618/category/1731634.html
https://www.cnblogs.com/zhenhua1618/category/1731636.html
https://www.cnblogs.com/zhenhua1618/category/1731638.html
https://www.cnblogs.com/zhenhua1618/category/1731641.html
https://www.cnblogs.com/zhenhua1618/category/1731643.html
https://www.cnblogs.com/zhenhua1618/category/1731646.html
https://www.cnblogs.com/zhenhua1618/category/1731648.html
https://www.cnblogs.com/zhenhua1618/category/1731651.html
https://www.cnblogs.com/zhenhua1618/category/1731654.html
https://www.cnblogs.com/zhenhua1618/category/1731656.html
https://www.cnblogs.com/zhenhua1618/category/1731660.html
https://www.cnblogs.com/zhenhua1618/category/1731662.html
https://www.cnblogs.com/zhenhua1618/category/1731665.html
https://www.cnblogs.com/zhenhua1618/category/1731667.html
https://www.cnblogs.com/zhenhua1618/category/1731669.html
https://www.cnblogs.com/zhenhua1618/category/1731672.html
https://www.cnblogs.com/zhenhua1618/category/1731674.html
https://www.cnblogs.com/zhenhua1618/category/1731677.html
https://www.cnblogs.com/zhenhua1618/category/1731679.html
https://www.cnblogs.com/zhenhua1618/category/1731681.html
https://www.cnblogs.com/zhenhua1618/category/1731683.html
https://www.cnblogs.com/zhenhua1618/category/1731686.html
https://www.cnblogs.com/zhenhua1618/category/1731688.html
https://www.cnblogs.com/zhenhua1618/category/1731691.html
https://www.cnblogs.com/zhenhua1618/category/1731694.html
https://www.cnblogs.com/zhenhua1618/category/1731696.html
https://www.cnblogs.com/zhenhua1618/category/1731698.html
https://www.cnblogs.com/zhenhua1618/category/1731701.html
https://www.cnblogs.com/zhenhua1618/category/1731703.html
https://www.cnblogs.com/zhenhua1618/category/1731706.html
https://www.cnblogs.com/zhenhua1618/category/1731708.html
https://www.cnblogs.com/zhenhua1618/category/1731710.html
https://www.cnblogs.com/zhenhua1618/category/1731712.html
https://www.cnblogs.com/zhenhua1618/category/1731715.html
https://www.cnblogs.com/zhenhua1618/category/1731717.html
https://www.cnblogs.com/zhenhua1618/category/1731719.html
https://www.cnblogs.com/zhenhua1618/category/1731754.html
https://www.cnblogs.com/zhenhua1618/category/1731755.html
https://www.cnblogs.com/zhenhua1618/category/1731756.html
https://www.cnblogs.com/zhenhua1618/category/1731758.html
https://www.cnblogs.com/zhenhua1618/category/1731759.html
https://www.cnblogs.com/zhenhua1618/category/1731760.html
https://www.cnblogs.com/zhenhua1618/category/1731762.html
https://www.cnblogs.com/zhenhua1618/category/1731763.html
https://www.cnblogs.com/zhenhua1618/category/1731765.html
https://www.cnblogs.com/zhenhua1618/category/1731766.html
https://www.cnblogs.com/zhenhua1618/category/1731767.html
https://www.cnblogs.com/zhenhua1618/category/1731768.html
https://www.cnblogs.com/zhenhua1618/category/1731770.html
https://www.cnblogs.com/zhenhua1618/category/1731771.html
https://www.cnblogs.com/zhenhua1618/category/1731772.html
https://www.cnblogs.com/zhenhua1618/category/1731773.html
https://www.cnblogs.com/zhenhua1618/category/1731775.html
https://www.cnblogs.com/zhenhua1618/category/1731776.html
https://www.cnblogs.com/zhenhua1618/category/1731777.html
https://www.cnblogs.com/zhenhua1618/category/1731779.html
https://www.cnblogs.com/zhenhua1618/category/1731780.html
https://www.cnblogs.com/zhenhua1618/category/1731782.html
https://www.cnblogs.com/zhenhua1618/category/1731783.html
https://www.cnblogs.com/zhenhua1618/category/1731785.html
https://www.cnblogs.com/zhenhua1618/category/1731786.html
https://www.cnblogs.com/zhenhua1618/category/1731787.html
https://www.cnblogs.com/zhenhua1618/category/1731788.html
https://www.cnblogs.com/zhenhua1618/category/1731790.html
https://www.cnblogs.com/zhenhua1618/category/1731791.html
https://www.cnblogs.com/zhenhua1618/category/1731793.html
https://www.cnblogs.com/zhenhua1618/category/1731794.html
https://www.cnblogs.com/zhenhua1618/category/1731795.html
https://www.cnblogs.com/zhenhua1618/category/1731797.html
https://www.cnblogs.com/zhenhua1618/category/1731798.html
https://www.cnblogs.com/zhenhua1618/category/1731800.html
https://www.cnblogs.com/zhenhua1618/category/1731802.html
https://www.cnblogs.com/zhenhua1618/category/1731804.html
https://www.cnblogs.com/zhenhua1618/category/1731807.html
https://www.cnblogs.com/zhenhua1618/category/1731808.html
https://www.cnblogs.com/zhenhua1618/category/1731811.html
https://www.cnblogs.com/zhenhua1618/category/1731812.html
https://www.cnblogs.com/zhenhua1618/category/1731814.html
https://www.cnblogs.com/zhenhua1618/category/1731816.html
https://www.cnblogs.com/zhenhua1618/category/1731818.html
https://www.cnblogs.com/zhenhua1618/category/1731821.html
https://www.cnblogs.com/zhenhua1618/category/1731822.html
https://www.cnblogs.com/zhenhua1618/category/1731825.html
https://www.cnblogs.com/zhenhua1618/category/1731826.html
https://www.cnblogs.com/zhenhua1618/category/1731828.html
https://www.cnblogs.com/zhenhua1618/category/1731831.html
https://www.cnblogs.com/zhenhua1618/category/1731832.html
https://www.cnblogs.com/zhenhua1618/category/1731834.html
https://www.cnblogs.com/zhenhua1618/category/1731837.html
https://www.cnblogs.com/zhenhua1618/category/1731839.html
https://www.cnblogs.com/zhenhua1618/category/1731841.html
https://www.cnblogs.com/zhenhua1618/category/1731843.html
https://www.cnblogs.com/zhenhua1618/category/1731846.html
https://www.cnblogs.com/zhenhua1618/category/1731848.html
https://www.cnblogs.com/zhenhua1618/category/1731850.html
https://www.cnblogs.com/zhenhua1618/category/1731852.html
https://www.cnblogs.com/zhenhua1618/category/1731856.html
https://www.cnblogs.com/zhenhua1618/category/1731857.html
https://www.cnblogs.com/zhenhua1618/category/1731859.html
https://www.cnblogs.com/zhenhua1618/category/1731863.html
https://www.cnblogs.com/zhenhua1618/category/1731864.html
https://www.cnblogs.com/zhenhua1618/category/1731866.html
https://www.cnblogs.com/zhenhua1618/category/1731868.html
https://www.cnblogs.com/zhenhua1618/category/1731870.html
https://www.cnblogs.com/zhenhua1618/category/1731871.html
https://www.cnblogs.com/zhenhua1618/category/1731874.html
https://www.cnblogs.com/zhenhua1618/category/1731876.html
https://www.cnblogs.com/zhenhua1618/category/1731878.html
https://www.cnblogs.com/zhenhua1618/category/1731880.html
https://www.cnblogs.com/zhenhua1618/category/1731881.html
https://www.cnblogs.com/zhenhua1618/category/1731884.html
https://www.cnblogs.com/zhenhua1618/category/1731886.html
https://www.cnblogs.com/zhenhua1618/category/1731887.html
https://www.cnblogs.com/zhenhua1618/category/1731890.html
https://www.cnblogs.com/zhenhua1618/category/1731891.html
https://www.cnblogs.com/zhenhua1618/category/1731893.html
https://www.cnblogs.com/zhenhua1618/category/1731895.html
https://www.cnblogs.com/zhenhua1618/category/1731896.html
https://www.cnblogs.com/zhenhua1618/category/1731898.html
https://www.cnblogs.com/zhenhua1618/category/1731899.html
https://www.cnblogs.com/zhenhua1618/category/1731901.html
https://www.cnblogs.com/zhenhua1618/category/1731903.html
https://www.cnblogs.com/zhenhua1618/category/1731904.html
https://www.cnblogs.com/zhenhua1618/category/1731906.html
https://www.cnblogs.com/zhenhua1618/category/1731907.html
https://www.cnblogs.com/zhenhua1618/category/1731909.html
https://www.cnblogs.com/zhenhua1618/category/1731911.html
https://www.cnblogs.com/zhenhua1618/category/1731912.html
https://www.cnblogs.com/zhenhua1618/category/1731914.html
https://www.cnblogs.com/zhenhua1618/category/1731915.html
https://www.cnblogs.com/zhenhua1618/category/1731917.html
https://www.cnblogs.com/zhenhua1618/category/1731919.html
https://www.cnblogs.com/zhenhua1618/category/1731920.html
https://www.cnblogs.com/zhenhua1618/category/1731922.html
https://www.cnblogs.com/zhenhua1618/category/1731923.html
https://www.cnblogs.com/zhenhua1618/category/1731925.html
https://www.cnblogs.com/zhenhua1618/category/1731927.html
https://www.cnblogs.com/zhenhua1618/category/1731928.html
https://www.cnblogs.com/zhenhua1618/category/1731930.html
https://www.cnblogs.com/zhenhua1618/category/1731932.html
https://www.cnblogs.com/zhenhua1618/category/1731933.html
https://www.cnblogs.com/zhenhua1618/category/1731935.html
https://www.cnblogs.com/zhenhua1618/category/1731936.html
https://www.cnblogs.com/zhenhua1618/category/1731938.html
https://www.cnblogs.com/zhenhua1618/category/1731940.html
https://www.cnblogs.com/zhenhua1618/category/1731941.html
https://www.cnblogs.com/zhenhua1618/category/1731943.html
https://www.cnblogs.com/zhenhua1618/category/1731945.html
https://www.cnblogs.com/zhenhua1618/category/1731946.html
https://www.cnblogs.com/zhenhua1618/category/1731948.html
https://www.cnblogs.com/zhenhua1618/category/1731949.html
https://www.cnblogs.com/zhenhua1618/category/1731951.html
https://www.cnblogs.com/zhenhua1618/category/1731954.html
https://www.cnblogs.com/zhenhua1618/category/1731956.html
https://www.cnblogs.com/zhenhua1618/category/1731958.html
https://www.cnblogs.com/zhenhua1618/category/1731960.html
https://www.cnblogs.com/zhenhua1618/category/1731963.html
https://www.cnblogs.com/zhenhua1618/category/1731966.html

猜你喜欢

转载自www.cnblogs.com/zhenhua1618/p/12729385.html