免费注册 查看新帖 |

Chinaunix

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

perl 正则表达式匹配的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-21 11:07 |只看该作者 |倒序浏览
my $data = "Barney Rubble Fred Flintstone Wilma Flintstone";
my %last_name = ($data =~ /(\w+)\s+(\w+)/g);
foreach (sort keys %last_name){
        printf "%s\t%s\n",$_,$last_name{$_};
}
#Output:
#Barney        Rubble
#Fred        Flintstone
#Wilma        Flintstone

为什么不是
Barney        Rubble
Rubble Fred
Fred Flintstone
Flintstone Wilma
Wilma Flintstone
哪位能解释一下么?给个连接,或相关文档也可以。


另外,用hash table 可以保存2个(\w+)的值;如果现在换成   $data =~ /(\w+)\s+(\w+)\s(\w+)/g的话,怎么把所有合适的匹配保存下来?
我希望能输出
Barney Rubble Fred
Flintstone Wilma Flintstone

===================
/(\w+)\s+(\w+)/g  # 任何两个相邻 word,中间用 space隔开
每次匹配,保存了2个单元的值,所以可以用hash table直接保存


/(\w+)\s+(\w+)\s(\w+)/g # 任何三个相邻 word,中间用 space隔开
每次匹配,保存了3个单元的值 $1,$2,$3;我希望能够输出所以匹配的3个单元,比如
Barney Rubble Fred
Flintstone Wilma Flintstone

如果可以的话,希望能够给一下demo代码
谢谢

论坛徽章:
0
2 [报告]
发表于 2010-01-21 11:21 |只看该作者
my $data = "Barney Rubble Fred Flintstone Wilma Flintstone";
my %last_name = ($data =~ /(\w+)\s+(\w+)/g);
foreach (sort keys %last_name){
        printf "%s\t%s\n",$_,$last_name{$_};
}
#Output:

#Barney        Rubble

#Fred        Flintstone

#Wilma        Flintstone



对于以上代码的输出 为什么不是你所期望的:
  1. Barney        Rubble
  2. Rubble Fred
  3. Fred Flintstone
  4. Flintstone Wilma
  5. Wilma Flintstone
复制代码


原因:
   perl 在匹配是遵循了对被匹配内容只使用一次的原则,例如  ‘Rubble’ 这个字串已经在第一次匹配当中使用了,那么后续的匹配就从这个字串之后开始,不会再重复使用该字串了。

对于第二个问题,你知道hash可以保存2个(\w+),那你应该知道array 可以保存很多(\w+)的,按照如下方法就可以
  1. my @result =$data =~ /(\w+)\s+(\w+)\s(\w+)/g
复制代码

论坛徽章:
0
3 [报告]
发表于 2010-01-21 11:57 |只看该作者
楼主是从ubuntu论坛过来的!?

论坛徽章:
0
4 [报告]
发表于 2010-01-25 12:55 |只看该作者
感谢楼上的解答
perl新手,以为perl有多维数组的概念

是的,ubuntu那问了,第一问没人解答;第二问就说了数组
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP