电话号码及日期时间提取(正则表达式 C语言)
直接看代码:
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.zzzyk.com
源文件PhoneDateExtract.c
#include "PhoneDateExtract.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <regex.h>
#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_date[0].rm_so), -1);
int n_size = strlen(s_phone);
(*phone) = (char*) malloc(n_size + 1);
memset((*phone), 0, n_size);
strcpy((*phone), s_phone);
free(s_phone);
return 0;
}
/**
* @biref 简体中文文本网页时间提取
* 正则表达式说明如下
* [0-9]{2,4}(-|/|年) //年份
* [0-9]{1,2}(-|/|月) //月份
* [0-9]{1,2} //日
* [0-9]{1,2} &nbs
补充:软件开发 , C语言 ,