因为要区分电话号码邮件等各种联系方式
,所以想用正则表达式来匹配,但是又要做到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 | 容器类,保存子正则表达式匹配的字符序列. |
使用起来还比较简单,但是由于我的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,
它快速、安全,线程友好,是
PCRE
、
PERL
和
python
等回溯正则表达式引擎(
backtracking
regular expression engine)的一个替代品。RE2 支持 linux
和绝大多数的 Unix 平台。
使用起来也很简单,github
:
https://github.com/google/re2
C++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));使用方式也是简单明了啊。