C 實現的字串模糊匹配

2022-02-06 05:52:07 字數 2563 閱讀 4392

c++基本沒有正規表示式功能,當然像boost裡提供了正則。本文**於園友的一篇文章,請看:

很早之前就看過這篇文章,原作者的需求很明確、**實現也很好。

之所以又寫這篇文章,是因為原作者只介紹了在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系統都能夠准入

**實現如下:

1

#ifdef os_windows2/*

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 178

#define fnmatch fnmatch_win910

/**copy from google-glog

*/11

bool safefnmatch(const

char* pattern,size_t patt_len,const

char*str,size_t str_len)

1229

if (pattern[p] == '*'

)3038 s += 1

;39 } while (s !=str_len);

4041

return

false;42

}4344return

false;45

}46}47

48/*

*注意:windows平台下尚未實現最後乙個引數flags的功能!!!

*/49

int fnmatch_win(const

char *pattern, const

char *name, int flags = 0)50

5657

#else

58 #include 59

#endif

6061

intmain()62,

66 ,

67 ,

68//

不能被匹配的

69 ,

70 ,

71 ,

72 ,

73 ,

7475

76};

77static

int pattern_arr_size = sizeof(pattern_arr) / sizeof(pattern_arr[0

]);78

79 vectorvec_str;

80for(int i = 0; i < pattern_arr_size; i ++)

8184

85 std::cout << "

origin str:

"<< orgin_str << "

\n\n";

86int

ret;

87for(int i = 0; i < vec_str.size(); i++)

8894

else

9598}99

100return0;

101 }

完整**請看:字串模糊匹配(fnmatch).cpp。

輸出如下:

當然,fnmatch的實現是原始碼可見的,也可以直接把linux下的實現改改用在windows平台。

fnmatch原始碼實現: 

fnmatch使用參考: 

關於字串模糊匹配

一種比kmp和bm 更高效的匹配演算法 如果想看原英文介紹,看下面分割線後的 適用於 模式串較短的情況,最壞時間複雜性為o n m 不過一般沒這麼壞 sunday演算法其實思想跟bm演算法很相似,只不過sunday演算法是從前往後匹配,在匹配失敗時關注的是文字串中參加匹配的最末位字元的下一位字元。如...

字串模糊匹配遞迴實現優化1

此程式可以匹配相似度比較大的字串。例如 fr irc6 產品描述 配件 family interdomain routing feature配件 fr irc6 產品描述 附件 family interdomain routing feature附件 熱縮套管 產品描述 1ac000570003 3...

字串模糊匹配 根據萬用字元

在我們程式設計過程中,經常需要遇到字串和指定的模板匹配,需要返回是否匹配字串模板。其中符號 匹配任意多個位元組,匹配單個字元 模板形式舉例如下 1 010 010?用於判斷 號碼是否是010開頭。2 民主 用於判斷文字中是否含有敏感詞。3 銀行 信用卡 用於判斷文字中是否含有特殊的語義。我們需要用文...