C++正則表示式匹配工具
阿新 • • 發佈:2019-01-06
因為要區分電話號碼郵件等各種聯絡方式,所以想用正則表示式來匹配,但是又要做到windows和Linux相容,所以查了一下,有RE2,glibc regex和C++ regex.
C++ regex
包含在標頭檔案<regex>中,大致的介面有:
參考官方文件:http://www.cplusplus.com/reference/regex/
使用起來還比較簡單,但是由於我的Linux環境的gcc還是4.1.2,太老了,又沒有許可權升級,所以Linux版本只能使用glibc regex。如果想要linux支援的話,gcc 版本至少需要4.9.0。
glibc regex
標頭檔案是<regex.h>,主要的介面如下: // 將正則式編譯成 regexec 使用的形式,preg 儲存 regex 編譯後的結果 int regcomp(regex_t *preg, constchar *regex, int cflags); // 匹配非空字串和預編譯好的正則式 int regexec(const regex_t *preg, constchar *string, size_t nmatch, regmatch_t pmatch[], int eflags); // 如果有錯誤發生,根據 errcode 得到相應的錯誤描述 size_t regerror( int errcode, const regex_t
*preg, char *errbuf, size_t errbuf_size);
// 釋放預編譯正則式的 buffer
void regfree(regex_t *preg);
RE2
另外一個強大的正則表示式庫就是RE2,它快速、安全,執行緒友好,是PCRE、PERL和python等回溯正則表示式引擎(backtracking regular
expression engine)的一個替代品。RE2 支援 linux 和絕大多數的 Unix 平臺。
使用起來也很簡單,github:https://github.com/google/re2
basic_regex | 正則表示式物件,是一個通用的模板,有typedef basic_regex<char> regex 和 typedef basic_regex<char_t>wregex; |
regex_match | 將一個字元序列和正則表示式匹配 |
regex_search |
尋找字元序列中的子串中與正則表示式匹配的結果,在找到第一個匹配的結果後就會停止查詢 |
regex_replace | 使用格式化的替換文字,替換正則表示式匹配到字元序列的地方 |
regex_iterator | 迭代器,用來匹配所有 的子串 |
match_results | 容器類,儲存正則表示式匹配的結果。 |
sub_match | 容器類,儲存子正則表示式匹配的字元序列. |
標頭檔案是<regex.h>,主要的介面如下: // 將正則式編譯成 regexec 使用的形式,preg 儲存 regex 編譯後的結果 int regcomp(regex_t *preg, constchar *regex, int cflags); // 匹配非空字串和預編譯好的正則式 int regexec(const regex_t *preg, constchar *string, size_t nmatch, regmatch_t pmatch[], int eflags); // 如果有錯誤發生,根據 errcode 得到相應的錯誤描述 size_t regerror(
RE2 re("(\\w+):(\\d+)"); assert(re.ok()); // compiled; if not, see re.error(); assert(RE2::FullMatch("ruby:1234", re, &s, &i)); assert(RE2::FullMatch("ruby:1234", re, &s)); assert(RE2::FullMatch("ruby:1234", re, (void*)NULL, &i)); assert(!RE2::FullMatch("ruby:123456789123", re, &s, &i));使用方式也是簡單明瞭啊。