linux下C的正则表达

最近帮一位学长处理一些气象数据
shell脚本有很多这种命令可以来处理
但好久没碰这些了,颇有些生疏
这次主要想通过c语言来操作
linux底下有个正则表达式的函数库
头文件— regex.h

不废话了

以下直接上代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>

int main()
{
    //char *test="09:00:00.676: <- $WIMWV,153.1,R,14.8,N,A*18"; 
    //上面为采集数据格式 主要获取首部的时间 R,参数前面的风向 N,前的风速
    const char *pattern="([0-9,:]{8}).[0-9]{3}[^0-9]{11},(.*),[R,T],(.*),[K,N,S],[A,V][*]\\w{2}";  //正则表达式格式 
    //一般形如[]{}格式,前者内容,后者长度, ()用来获取对应匹配
    regex_t reg; //结构体数据类型 用来存放编译后的正则表达式
    int err,nm=5; 
    char errbuf[100]={0}; //错误提示缓冲区
    char match[100]={0}; //用于记录匹配后的字符串
    regmatch_t pmatch[nm]; //结构体存放匹配串在目标串中的开始和结束位置

    //把制定的正则表达式pattern编译成一种特定的数据格式,增加匹配效率
    if(err=regcomp(&reg,pattern,REG_EXTENDED)<0){
        regerror(err,&reg,errbuf,sizeof(errbuf)); //判断是否正常 
        printf("err:%s\n",errbuf);
    }
    int i=0;
    int len=0;

    //一读一写
    FILE *fp1=NULL;
    FILE *fp2=NULL;
    if((fp1=fopen("wind.txt","r"))==NULL){
        printf("open wind error\n"); 
        exit(-1);
    }
    fp2=fopen("wind_handle.txt","w+");
    char lineData[50]={0}; //存放从文本中取出的一行字符串
    while(!feof(fp1))
    {
        memset(lineData,0,sizeof(lineData));
        fgets(lineData,sizeof(lineData),fp1); //读入n-1,最后加'\0'
        //在读完n-1字符前遇到'\n'或结束符EOF,读入即结束
        //printf("%s\n",lineData);

        err=regexec(&reg,lineData,nm,pmatch,0); //开始匹配
        if(err==REG_NOMATCH){
            printf("no match\n"); 
            exit(-1);
        }else if(err){
            regerror(err,&reg,errbuf,sizeof(errbuf)); 
            printf("err:%s\n",errbuf);
            exit(-1);
        } 
        for(i=1;i<5&&pmatch[i].rm_so!=-1;i++){
            len=pmatch[i].rm_eo-pmatch[i].rm_so;
            if(len){ //如果有获取到匹配
                memset(match,'\0',sizeof(match)); 
                memcpy(match,lineData+pmatch[i].rm_so,len); //对应位置copy到缓冲区
                //printf("%s\n",match);
                fprintf(fp2,"%s\t",match); //写入文件(缓冲处) \t分割
            }
        }
        fprintf(fp2,"\n");
        fflush(fp2); //清空操作缓存,把数据写入文件中
    }
    regfree(&reg); //清空compiled指向的regex_t结构体内容
    //重新编译的话,一定要先清空regex_t结构体
    close(fp1);
    close(fp2);
    return 0;
}

正则表达对于处理数据来说不可或缺
大家可以多了解了解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值