设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 889|回复: 2
打印 上一主题 下一主题

[已经解决] 什么是后向引用

 关闭 [复制链接]
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-8-15
帖子
98
跳转到指定楼层
1
发表于 2009-9-9 03:57:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
2
发表于 2009-9-9 04:55:26 | 只看该作者
本帖最后由 紫苏 于 2009-9-9 04:56 编辑

F1里面不是有例子吗……

正则表达式中如果有括号,那么括号中实际匹配成功的字符串就会被保存起来,而通过后向引用,就可以获取这些字符串的内容~后向引用有时可以起到节省正则表达式长度的作用——在表达式中经常会需要匹配固定的、重复的内容,这时可以在第一次匹配时把内容用括号括起来,第二次需要匹配相同内容时使用后向引用就行了

正则表达式中的 \1、\2、\3、……、\n 就是通过后向引用在表达式中按照序号获取括号中的内容,括号的顺序以左括号出现的先后排列~
例 1:
  1. str = "11"
  2. # 匹配成功
  3. # [0-9] 匹配任意一个数字,紧跟着 \1 表示要这个匹配成功的数字再次出现一次
  4. p /([0-9])\1/ =~ str

  5. str = "12"
  6. # 匹配失败
  7. # 这时 \1 的内容是 "1","11" 当然不匹配 "12" 了
  8. p /([0-9])\1/ =~ str
复制代码
注意后向引用引用的是实际成功匹配的字符串,而不是正则表达式原本的内容:上面的第二段代码中,虽然括号中是匹配 0-9 的任意数字,但后向引用后其实是实际成功匹配的 "1",而不是 再次匹配任意数字 "[0-9]"~正如上面所说,后向引用是用来匹配“固定的、重复的”内容的,而 [0-9] 显然并非匹配固定字符串……

例 2:
  1. str = "helloworldhelloworldhellohelloworldworld"
  2. p /((hello)(world))\1\2\1\3/ =~ str  # 匹配成功
复制代码
这个看起来似乎有点晕,其实理解了后向引用的嵌套性就不难理解了——
第一个出现的括号包含了 "helloworld",第二个出现的括号包含了 "hello",第三个出现的括号包含了 "world",所以通过 \1、\2、 \3 可以分别引用到这三个字符串
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-8-15
帖子
98
3
 楼主| 发表于 2009-9-9 17:24:27 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-1-9 17:12

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表