当前位置:编程学习 > C/C++ >>

电话号码及日期时间提取(正则表达式 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语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,