在用正则表达式进行电话号码和邮箱的格式验证的时候,发现网络上并没有很好的关于linux c 的正则表达式的材料。大多都是对函数进行了一下翻译之类的,对使用则涉及的不全面。
下面是我写的一个例子,其中比较关键的点我都添加了注释,希望对你有帮助。
#include <stdio.h>
#include <sys/types.h>
#include <regex.h>
/*
一般的现在的linux发行版本都应该包含了这个头文件的
*/
int main(int argc, char** argv)
{
regex_t reg;
//这是一个待填充的数据结构,它具有指针数据类型,指针的值和对应的空间都会在regcomp后被填充。
regmatch_t pmatch[1];
//这个是存放字符模式串解析结果的。该数组的第一个存放主串,后面存放子串
const size_t nmatch = 1;
//这是模式串的数目,本例子只是一个简单的数字判定段,所以只是使用了一个元素
const char* pattern = "^[0-9]{1,7}$";
/*
我使用的模式串,一般的,推荐不要使用\d\w等此类的等价字符,不因为别的,就因为我在使用的时候,发现支持的不是很好,
例如上述的匹配规则,如果换成等价字符应该是^\\d{1,7}$,可是实际,这个却不能很好的工作,所以告诫不要胡乱使用等价串。这里
特别标记下有哪些是等价串:
\d等价于[0-9]
\w等价于[A-Za-z0-9]。
尽量使用标准的写法吧。
另外提醒一下,js中用的非常的频繁的模式串不是拿来就可以用的。至少,在js中\不用转义,在c中明显就要转义吧!
*/
regcomp(®, pattern, REG_EXTENDED);
//上述函数,第二个就是模式串,第三个是匹配标记值,这个不是很关键
int status = regexec(®, argv[1], nmatch, pmatch ,0);
//regexec是实际执行正则验证的函数,其中,第二个参数是待比较的字符串,它的返回值就是执行结果代码error
char error[100];
size_t length = regerror(status, ®, error,100);
//注意了,上述函数的第一个参数就是regexec函数的返回值。
printf("%s", error);
regfree(®);
//当然最后要释放空间的
return 0;
}