免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8346 | 回复: 14
打印 上一主题 下一主题

perl查找、截取字符的正则表达式 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-28 22:05 |只看该作者 |倒序浏览
现在要将文件中的每条记录中的指定字符串截取出来具体如下:
记录:
WAP_GATEWAY_ID=XZ-WAPGW         BEARER_TYPE=2         USER_MSISDN=+8618091019685         Pesu_ID=         SP_Name=         UserType=         IMEI=         
WAP_GATEWAY_ID=XZ-WAPGW         BEARER_TYPE=2         USER_MSISDN=+8618091019686         SP_Name=         UserType=         IMEI=       
现在,我想要的是
第一条记录:XZ-WAPGW,2+8618091019685, , , ,
第二条记录(第二条记录中没有Pesu_ID= 这个内容但是我想取的是如果没有这个内容,
我就将它自动补一个空格XZ-WAPGW,2+8618091019685, , , ,  
像这种正则表达式如何写呢?我才开始学习。请各位指导一下。谢谢1

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
2 [报告]
发表于 2012-06-28 22:59 |只看该作者
  1. while (<DATA>) {
  2.     if (/WAP_GATEWAY_ID=(\S+)\s+BEARER_TYPE=(\d+)\s+USER_MSISDN=(\+\d+)\s+(?:Pesu_ID=(\S*?)\s+)?SP_Name=(\S*?)\s+UserType=(\S*?)\s+IMEI=(\S*?)/i) {
  3.         print "$1, $2$3, $4, $5, $6, $7\n";
  4.     }
  5. }
  6. __DATA__
  7. WAP_GATEWAY_ID=XZ-WAPGW         BEARER_TYPE=2         USER_MSISDN=+8618091019685         Pesu_ID=         SP_Name=         UserType=         IMEI=         
  8. WAP_GATEWAY_ID=XZ-WAPGW         BEARER_TYPE=2         USER_MSISDN=+8618091019686         SP_Name=         UserType=         IMEI=        
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
3 [报告]
发表于 2012-06-28 23:38 |只看该作者
回复 1# mylusing
  1. perl -le '$str="WAP_GATEWAY_ID=XZ-WAPGW         BEARER_TYPE=2         USER_MSISDN=+8618091019685         Pesu_ID=         SP_Name=         UserType=         IMEI=
  2. WAP_GATEWAY_ID=XZ-WAPGW         BEARER_TYPE=2         USER_MSISDN=+8618091019686         SP_Name=         UserType=         IMEI=   ";
  3. $str=~/([^=]+)=(\S+)*\s+(\s)(?{printf (($2||" ").",".$3)})(*SKIP)(*FAIL)/;
  4. '
  5. XZ-WAPGW, 2, +8618091019685,  ,  ,  ,  ,
  6. XZ-WAPGW, 2, +8618091019686,  ,  ,  ,
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
4 [报告]
发表于 2012-06-29 13:49 |只看该作者
  1. #!/usr/bin/perl

  2. my @k = qw/WAP_GATEWAY_ID BEARER_TYPE USER_MSISDN Pesu_ID SP_Name UserType IMEI/;

  3. while (<DATA>) {
  4.     my %h = map { /(.*)=(.*)/; $1, $2 } split;
  5.     my @a = map { $h{$_} ||= '' } @k;
  6.     print join( ', ', $a[0], $a[1] . $a[2], @a[ 3 .. $#a ] ), "\n";
  7. }
  8. __DATA__
  9. WAP_GATEWAY_ID=XZ-WAPGW         BEARER_TYPE=2         USER_MSISDN=+8618091019685         Pesu_ID=         SP_Name=         UserType=         IMEI=        
  10. WAP_GATEWAY_ID=XZ-WAPGW         BEARER_TYPE=2         USER_MSISDN=+8618091019686         SP_Name=         UserType=         IMEI=
复制代码

论坛徽章:
0
5 [报告]
发表于 2012-06-29 15:48 |只看该作者
回复 2# cdtits


    麻烦能给我讲一下 $1 $2 $3 $4 等,这几个参数的对应关系么?

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
6 [报告]
发表于 2012-06-29 15:55 |只看该作者
回复 5# mylusing


    正则表达式中捕获小括号,从左向右数,第一个为 $1,第二个为 $2,依次类推

论坛徽章:
0
7 [报告]
发表于 2012-06-29 16:06 |只看该作者
回复 4# rubyish


你能否给我一个联系方式,我想继续问一下这个问题


   

论坛徽章:
0
8 [报告]
发表于 2012-06-29 17:21 |只看该作者
2L正解!!!

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
9 [报告]
发表于 2012-06-30 14:20 |只看该作者
本帖最后由 rubyish 于 2012-06-30 10:22 编辑
mylusing 发表于 2012-06-29 12:06
回复 4# rubyish
你能否给我一个联系方式,我想继续问一下这个问题

在这里你可以继续问问题
这里有很多大师

论坛徽章:
0
10 [报告]
发表于 2012-07-01 17:33 |只看该作者
回复 9# rubyish


my %h = map { /(.*)=(.*)/; $1, $2 } split;
my @a = map { $h{$_} ||= '' } @k;
print join( ', ', $a[0], $a[1] . $a[2], @a[ 3 .. $#a ] ), "\n";



这几句中的%h 这个我知道,是哈希函数,但是后面的map是什么意思,另外/(.*)=(.*)/ 写在map里面是什么意思?
后面的基本上知道。 我不熟悉perl,但是我理解是将数据放到一个数组中,然而如果这些数据中有些数据有空格,
但是又需要将这些空格放在数组中,该如何处理。
比如:
mylusing cd me811
把上面这些数据放在数组中的一个元素中,又该怎么写呢?
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP