免费注册 查看新帖 |

Chinaunix

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

对正则中反向引用和捕获变量的疑问 [复制链接]

论坛徽章:
0
发表于 2012-10-30 10:02 |显示全部楼层
疑问:Perl中,正则表达式的反向引用和捕获变量啥区别呢?是不是其实是一个东西的两个面孔?

已知:反向引用可以这么写
  1. \1,\2
复制代码
或者
  1. \g{1},\g{2} #use 5.010
复制代码
; 而捕获变量是
  1. $1,$2
复制代码
或者命名捕捉。

我发现进行正则替换的时候,即如同
  1. #!/usr/bin/env perl
  2. use warnings;
  3. use strict;
  4. use 5.010;

  5. while(<DATA>){
  6.        s/(\d+)(gaga)/$1_gaga/g;
  7.        print;
  8. }
  9.   
  10.   __DATA__
  11. gaga1213
  12. 32435gaga92932
  13. gagalady
复制代码
捕获变量是可以的,但是\g{1}形式的反向引用就无效,而\1形式的反向仍然有效。
所以,感觉捕获变量和反向引用这两者还是不一样的东西。能不能请行家讲讲其本质区别在哪里呢   谢谢

论坛徽章:
0
发表于 2012-10-30 10:19 |显示全部楼层
本帖最后由 gaoyang636 于 2012-10-30 10:23 编辑

我刚才又拿小骆驼的例子实验了一下:
  1. $_="abba";
  2. if(/(.)\1/){
  3.     print "Matched!_ $ & _\n"; #$后的空格此处不得已加上,否则显示不正常,下同

  4. }
复制代码
此处仅能使用反向引用;如果使用$1,会警告实际上$1未被赋值,即并未捕捉。

这是不是说明了两者机制的不同?比如 捕获变量是匹配完成之后,才写入变量?所以这里实际上还未匹配完,所以$1为空 ?
因为我如果把print行 改为
  1. print "_$1_Matched!_ $ & _ \n"
复制代码
, 此时的$1是捕获到了这个开头的"a" 的。

论坛徽章:
0
发表于 2012-10-30 10:30 |显示全部楼层
回复 2# gaoyang636


    捕获变量保存的是字符串,说明它是标量变量。在perl里面,它们的名称就是$1和$2这样的形式。模式中有多少个捕获括号,就有多少个对应名称的捕获变量可用。所以,变量$2的意思就是模式中第2对括号所匹配的字符串内容,这个内容和模式运行期间反向引用\2所表示的内容是一样的。但它们并不是同一个事物的两种名称:\2反向引用的是模式匹配期间得到的结果,而$2则是模式匹配结束后得到的捕获内容的索引。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2012-10-30 11:01 |显示全部楼层
想了这么多了不如直接看文档啊, perlre 也没多长

论坛徽章:
0
发表于 2012-10-31 08:35 |显示全部楼层
回复 3# wsxedcer


    谢谢~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP