解决一个模式匹配需求

来源:互联网 发布:数据库实体类生成工具 编辑:程序博客网 时间:2024/05/23 01:17

log 如下:

链路名称                            是否使用    是否故障        是否闭塞        是否激活            本端是否禁止              对端是否禁止                是否拥塞        是否倒换                是否倒回              信令链路选择码(十六进制)                           Server名称

 

 BSH-BSC37_9                          正在使用    正常            未闭塞          已激活              本端管理解禁              对端管理解禁                未拥塞          未发生倒换              未发生倒回            09                                                 LOCAL          
BSC39_15                            正在使用    正常            未闭塞          已激活              本端管理解禁              对端管理解禁                未拥塞          未发生倒换              未发生倒回            0F                                                 LOCAL          

 

(由于篇幅大小,只能对应的看了,例如 链路名称对应 BSH-BSC37_9,是否激活 对应 已激活)

需求如下:

匹配log是否有错,以下为正常情况下对应的字段:

是否故障:正常  是否使用:正在使用 信令链路选择吗(十六进制):不为空

 

整体解决方案:

将每一行读入,之后匹配判断,发现的问题:

1.标题和正文的如果用/S匹配那么是一样的:解决:用单词匹配,这样就区分了中文和单词,但是在单词匹配中链路名称有的有-,所以先将-去除,代码如下:

$line =~s/-//g;   匹配方案:/b/w+/b

2.解决16进制问题,首先如何匹配16进制,另外需求中的16进制数是0个或多个,解决方案:[[:xdigit:]/s+]{0,}   ;  [:xdigit:]是匹配16进制的意思,/s+是会有空格出现(因为 log中多个十六进制会用空格隔开),{0,}至少匹配0次

 

由于匹配出来的$11为     NULL(有很多空格)如果$11 eq "NULL" 肯定是不成功的,所以 用字符串处理函数

   if(index($11,"NULL") != -1)
   {
    $null_flag = 1;
   }

若找到了说明$11中包含NULL

 

总体的匹配方案:

$line =~m/^/s*/b/w+/b/s+(/S+)/s+(/S+)/s+(/S+)/s+(/S+)/s+(/S+)/s+(/S+)/s+(/S+)/s+(/S+)/s+(/S+)/s+([[:xdigit:]/s+]{0,})/s+(/S+)/s*$/)

 

 

 

 

原创粉丝点击