设为首页 加入收藏

TOP

电话号码及日期时间提取(正则表达式 C语言) (一)
2014-11-23 23:30:03 来源: 作者: 【 】 浏览:1
Tags:电话号码 日期 时间 提取 正则 表达式 语言

直接看代码:

PhoneDateExtract.h

/**

\brief A define file.

\filename : PhoneDateExtract.h

\date : 24-Mar-2011.

\version : 0.1.1

: 0.1.2 (modify in 2011-10-08 as 400/800 phone numbers)

\author : Guohua

*/

#ifndef __PHONE_DATE_EXTRACT_H__

#define __PHONE_DATE_EXTRACT_H__

/**

* @biref 中国大陆区域通用电话号码提取

* 正则表达式说明如下

* (

* ([0-9]{11}) // 11位手机号码

* |

* (

* (400|800)([0-9\\-]{7,10}) // 400或800号码

* |(([0-9]{4}|[0-9]{3})(-| ) ) ([0-9]{7,8})((-| |转)*([0-9]{1,4})) // 固定电话号码

* )

* )

* @demo

* char* phone = NULL;

* phone_extract("2011年3月7日 14:03", &phone);

* printf("format phone = [%s]\n", phone);

* free(phone);

* @param str 待处理的字符串

* @param phone [output] 提取出的电话号码子串(要注意在外面释放其堆内存)

* @return 返回0表示成功,否则出错。

*/

int phone_extract(const char* str, char** phone);

/**

* @biref 简体中文文本网页时间提取

* 正则表达式说明如下

* [0-9]{2,4}(-|/|年) //年份

* [0-9]{1,2}(-|/|月) //月份

* [0-9]{1,2} //日

* [0-9]{1,2} //小时

* :[0-9]{1,2} //分钟

* (:[0-9]{1,2}) //钞

* @demo

* char* datetime = NULL;

* datetime_extract("2011年3月7日 14:03", &datetime);

* printf("format datetime = [%s]\n", datetime);

* free(datetime);

* @param str 待处理的字符串

* @param date [output] 提取出的日期时间子串,

* 其格式为“yy-MM-dd hh-mm-ss”的字符串(要注意在外面释放其堆内存)

* @return 返回0表示成功,否则出错。

*/

int datetime_extract(const char* str, char** date);

#endif // __PHONE_DATE_EXTRACT_H__

www.2cto.com

源文件PhoneDateExtract.c

#include "PhoneDateExtract.h"

#include

#include

#include

#include

#define return_if_fail(expr, val) \

do { \

if (!(expr)) return val; \

}while(0);

/**

* @biref 字符串取子串

* @param str 原始字符串

* @param pos 截取开始位置

* @param len 截取长度

* @return 子串对应上址,如果返回NULL表示出错。

*/

char* substr(const char* str, int pos, int len);

/**

* @biref 字符串正向查找

* @param src 待处理的主字符串

* @param str 要查找的子字符串

*/

int find(const char *src, const char *str);

/**

* @biref 字符串反向查找

* @param src 待处理的主字符串

* @param str 要查找的子字符串

*/

int rfind(const char *src, const char *str);

/**

* @biref 中国大陆区域通用电话号码提取

* 正则表达式说明如下

* (

* ([0-9]{11}) // 11位手机号码

* |

* (

* (400|800)([0-9\\-]{7,10}) // 400或800号码

* |(([0-9]{4}|[0-9]{3})(-| ) ) ([0-9]{7,8})((-| |转)*([0-9]{1,4})) // 固定电话号码

* )

* )

* @demo

* char* phone = NULL;

* phone_extract("2011年3月7日 14:03", &phone);

* printf("format phone = [%s]\n", phone);

* free(phone);

* @param str 待处理的字符串

* @param phone [output] 提取出的电话号码子串(要注意在外面释放其堆内存)

* @return 返回0表示成功,否则出错。

*/

int phone_extract(const char* str, char** phone)

{

// 正则表示式提取

const char* pattern_date = "(([0-9]{11})|((400|800)([0-9\\-]{7,10})|(([0-9]{4}|[0-9]{3})(-| ) ) ([0-9]{7,8})((-| |转)*([0-9]{1,4})) ))";

int z = 0;

regex_t reg_date, reg_time;

regmatch_t pm_date[1], pm_time[1];

regcomp(®_date, pattern_date, REG_EXTENDED);

z = regexec(®_date, str, 1, pm_date, 0);

regfree(®_date);

if(0 != z)

{

fprintf(stderr, " invalid phone number format: [%s]\n", str);

*phone = NULL;

return -1;

}

// 保存号码结果

char* s_phone = NULL;

return_if_fail(s_phone = substr(str,

pm_date[0].rm_so,

pm_date[0].rm_eo - pm

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Qt-托盘功能 下一篇sscanf和sprintf()函数使用说明

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: