免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yahoon
打印 上一主题 下一主题

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

论坛徽章:
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
11 [报告]
发表于 2012-03-30 16:58 |只看该作者
回复 7# sjdy521

这是深层问题...
回头看楼主给的例...
为什么要改变\1,\2...因为捕获值改变...

如果用 (\d)\g{-1}
就不用管(\d)的捕获值有没有改变

你不是叫人多读书....自己读读吧....
   

论坛徽章:
0
12 [报告]
发表于 2012-03-30 17:00 |只看该作者
回复 10# yahoon


    有失效吗?我的理解,你设置了不捕获,那么自然(\d)捕获到的东西是不会存储在$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
13 [报告]
发表于 2012-03-30 17:01 |只看该作者
本帖最后由 jason680 于 2012-03-30 17:10 编辑

回复 6# yahoon

5.8.8已经六年了...升级你的perl吧!!!
http://search.cpan.org/~nwclark/perl-5.8.8/
perl-5.8.8          [Download] [Browse]          31 Jan 2006


如果用 (\d)\g{-1}
就不用管(\d)的捕获值有没有改变
   

论坛徽章:
0
14 [报告]
发表于 2012-03-30 17:18 |只看该作者
回复 11# jason680


    又去仔细读了一遍,但是还是感觉不理解你说的。。我再多读几遍,多实验下吧

论坛徽章:
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
15 [报告]
发表于 2012-03-30 17:34 |只看该作者
本帖最后由 jason680 于 2012-03-30 17:34 编辑

回复 14# sjdy521

Here you are

$ perl -e '$_="112233"; if(m/\b((\d)\2)+\b/){print "str match\n"}'
str match

$ perl -e '$_="112233"; if(m/\b(?:(\d)\2)+\b/){print "str match\n"}'
Reference to nonexistent group in regex; marked by <-- HERE in m/\b(?:(\d)\2 <-- HERE )+\b/ at -e line 1.

$ perl -e '$_="112233"; if(m/\b(?:(\d)\1)+\b/){print "str match\n"}'
str match

# use \g{-1} that didn't care about what capture number(\1 or \2) for (\d)

$ perl -e '$_="112233"; if(m/\b((\d)\g{-1})+\b/){print "str match\n"}'
str match

$ perl -e '$_="112233"; if(m/\b(?:(\d)\g{-1})+\b/){print "str match\n"}'
str match

论坛徽章:
0
16 [报告]
发表于 2012-03-30 17:38 |只看该作者
回复 15# jason680


    要下班了 我先记着,晚上回去看

论坛徽章:
0
17 [报告]
发表于 2012-03-30 17:51 |只看该作者
回复 16# sjdy521

$ perl -e '$_="112233"; if(m/\b(?\d)\2)+\b/){print "str match\n"}'
Reference to nonexistent group in regex; marked by <-- HERE in m/\b(?\d)\2 <-- HERE )+\b/ at -e line 1.
对比
$ perl -e '$_="112233"; if(m/\b((\d)\2)+\b/){print "str match\n"}'
str match

前者仅仅多了?:,\2就不起作用了

论坛徽章:
0
18 [报告]
发表于 2012-03-30 17:53 |只看该作者
回复 12# sjdy521

非常的合理

就是非捕获的分组没有对应的 $n和\n
文档里面好像就只说没有$n而已

   

论坛徽章:
0
19 [报告]
发表于 2012-03-30 22:29 |只看该作者
本帖最后由 sjdy521 于 2012-03-30 22:30 编辑

回复 1# yahoon


    童鞋,方法2可以匹配到呢
  1. #方法2
  2. if (/\b(?:(\d)\1)+\b/) {
  3.         print "str match";
  4. }
复制代码
根据我做的一些实验,(?:)不不捕获模式下,如果里面再有括号,仍然会捕获,并存放在$1,$2...
因此方法2中的(\d)对应$1,也的确是可以使用\1的呀

论坛徽章:
0
20 [报告]
发表于 2012-03-30 22:31 |只看该作者
回复 15# jason680


    晚上做了一些测试,得出的结论是在你的例子中\g{-1}就是\1 没其他什么特别的。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP