C++正则表达式匹配工具

时间:2022-03-16 06:34:17
因为要区分电话号码邮件等各种联系方式,所以想用正则表达式来匹配,但是又要做到windows和Linux兼容,所以查了一下,有RE2,glibc regex和C++ regex. C++ regex 包含在头文件<regex>中,大致的接口有:
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 容器类,保存子正则表达式匹配的字符序列.
参考官方文档: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, const char *regex, int cflags);  // 匹配非空字符串和预编译好的正则式 int regexec(const regex_t *preg, const char *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);
可以参考官方文档:http://www.gnu.org/software/libc/manual/html_node/Regular-Expressions.html#Regular-Expressions RE2 另外一个强大的正则表达式库就是RE2,它快速、安全,线程友好,是PCREPERLpython等回溯正则表达式引擎(backtracking regular expression engine)的一个替代品。RE2 支持 linux 和绝大多数的 Unix 平台。 使用起来也很简单,githubhttps://github.com/google/re2C++API介绍:https://github.com/google/re2/wiki/CplusplusAPI,但是由于我的linux环境支持不了c++11,所以也只能放弃。贴个官网例子:
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));
使用方式也是简单明了啊。