免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1670 | 回复: 5

由SHELL版块想到的一个匹配问题 [复制链接]

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
发表于 2012-04-11 15:32 |显示全部楼层
本帖最后由 mcshell 于 2012-04-11 15:37 编辑

问题是这样的:

如果有一行字符串$line = '我的email是23895789@qq.com,请联系我',如何把其中的邮件地址打印出来,打印的格式是:
23895789@qq.com 23895789
即:username@xx.com username 的格式
需要注意的是,字符串里面可能有很多email,需要全部打印出来,就是说要匹配邮件地址,然后打印出来,不知道我说清楚了没,真心请教大侠,结草衔环,感激不尽!

我想了下可能出现的情况有可能是:
我的email是23895789@xx.com,请联系我'
我的email是23895789@vip.xx.com,23895789@vip.xx.com,23895789@vip.xx.com,请联系我'
我的email是abc@xx.com,请联系我'

我给出的答案是:
  1. [root@234267 mcshell]# perl -lne 'if(/(([a-zA-Z0-9._%+-]+)@\S+?(?=[,]))/){print "$1\t$2"}' tmp
  2. 23895789@xx.com 23895789
  3. 23895789@vip.xx.com   23895789
  4. abc@xx.com      abc
  5. [root@234267 mcshell]# cat tmp
  6. 我的email是23895789@xx.com,请联系我'
  7. 我的email是23895789@vip.xx.com,请联系我'
  8. 我的email是abc@xx.com,请联系我'
复制代码
但是我想要的结果是

23895789@xx.com 23895789
23895789@vip.xx.com   23895789 23895789@vip.xx.com   23895789 23895789@vip.xx.com   23895789
abc@xx.com      abc


我觉得regex本身应该没有问题
如图
perl-regex.jpg
请大家帮我看看问题出在哪里了

论坛徽章:
0
发表于 2012-04-11 15:44 |显示全部楼层
perl -ne 's/[\r\n]+$//;while(/(([\w.]+)@[\w.]+),?/g){print $1,"\t",$2,"\t"} print "\n";'

论坛徽章:
0
发表于 2012-04-11 16:03 |显示全部楼层
应该加修饰符/g就可以了
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;
  4. while (<DATA>) {
  5.         while ($_ =~ /(([a-zA-Z0-9._%+-]+)@\S+?(?=[,]))/g)
  6.         {
  7.                 print "$1\t$2,";
  8.         }
  9.          print "\n";
  10. }

  11. <>;

  12. __DATA__
  13. 我的email是23895789@xx.com,请联系我'
  14. 我的email是23895789@vip.xx.com,23895789@vip.xx.com,23895789@vip.xx.com,请联系我'
  15. 我的email是abc@xx.com,请联系我'
复制代码

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
发表于 2012-04-11 16:26 |显示全部楼层
回复 3# iamlimeng


    谢谢。。明白了。

论坛徽章:
0
发表于 2012-04-19 18:04 |显示全部楼层
回复 1# mcshell


大哥,请教个问题   
perl -lne 'if(/(([a-zA-Z0-9._%+-]+)@\S+?(?=[,]))/){print "$1\t$2"}' tmp
这句中  ?(?=[,])  是什么意思啊??







论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2012-04-19 19:30 |显示全部楼层
64805176 发表于 2012-04-19 18:04
perl -lne 'if(/(([a-zA-Z0-9._%+-]+)@\S+?(?=[,]))/){print "$1\t$2"}' tmp
这句中  ?(?=[,])  是什么意思啊??


第一個 ? 作用於前面的 \S,後面的 (?=pattern) 在 perlre 中有描述。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP