免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 7029 | 回复: 25

正则分组的捕获与反向引用 [复制链接]

论坛徽章:
0
发表于 2012-03-30 15:04 |显示全部楼层
本帖最后由 yahoon 于 2012-03-30 15:06 编辑

在写一个小的匹配时发现的:

我希望匹配112233..这样的pattern
用了两种方法:


  1. 方法1
  2. if (/\b((\d)\2)+\b/) {
  3.        print "str match";
  4. }

  5. 方法2
  6. if (/\b(?:(\d)\1)+\b/) {
  7.         print "str match";
  8. }
复制代码
比较两种方式
我在方法2中没用捕获,反向引用"\1"代表的是(\d),而不是最外围的第一个"(".

原以为非捕获模式下仅仅是不能用$1,$2之类的变量,原来连该分组的反向引用也失效了.


论坛徽章:
0
发表于 2012-03-30 15:37 |显示全部楼层
3Q 分享

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2012-03-30 16:04 |显示全部楼层
回复 1# yahoon

perldoc perlre
...
       Thus "\g{-1}" refers to the last buffer, "\g{-2}" refers to the buffer
       before that. For example:

               /
                (Y)            # buffer 1
                (              # buffer 2
                   (X)         # buffer 3
                   \g{-1}      # backref to buffer 3
                   \g{-3}      # backref to buffer 1
                )
               /x

       and would match the same as "/(Y) ( (X) \3 \1 )/x".

论坛徽章:
0
发表于 2012-03-30 16:44 |显示全部楼层
回复 3# jason680

我用的perl 5.8.8
我的perldoc中没你这里引用的内容

并且我的代码中是用的\1 而不是\-1


   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2012-03-30 16:48 |显示全部楼层
回复 4# yahoon

http://perldoc.perl.org/perlre.html
The \g and \k notations were introduced in Perl 5.10.0. Prior to that there were no named nor relative numbered capture groups.
   

论坛徽章:
0
发表于 2012-03-30 16:52 |显示全部楼层
本帖最后由 yahoon 于 2012-03-30 16:54 编辑

回复 5# jason680

非常感谢
可是我讨论的是我当前的版本的发现
你所引用的版本不适用于我目前的情况
非常感谢

另请详细看一下我贴出的code
方法1中\2 用来引用(\d)
方法2中\1 用来引用(\d)
这是我的疑问所在

和新版的\g啥的没任何关系

还是 等别人的回答


   

论坛徽章:
0
发表于 2012-03-30 16:52 |显示全部楼层
回复 3# jason680


    所问非所答呢
楼主关注的是非捕获模式下 \g{} 还能不能使用呢

论坛徽章:
0
发表于 2012-03-30 16:54 |显示全部楼层
本帖最后由 sjdy521 于 2012-03-30 16:54 编辑

回复 6# yahoon


    啊?这个问题,你自己不是都说明的很清楚了?还等别人回答什么?~~~

论坛徽章:
0
发表于 2012-03-30 16:55 |显示全部楼层
回复 7# sjdy521

还是你懂啊 呵呵
貌似在对某个分组非捕获的情况下,此分组的引用也失效了
多谢支持


   

论坛徽章:
0
发表于 2012-03-30 16:57 |显示全部楼层
回复 8# sjdy521
这个是我发现的
我没从文档里面找到非捕获模式会导致引用失效的内容
所以想让大家看看(我怕是自己理解错了 哈哈)

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP