Project1

标题: 什么是后向引用 [打印本页]

作者: 瓦沙尔    时间: 2009-9-9 03:57
提示: 作者被禁止或删除 内容自动屏蔽
作者: 紫苏    时间: 2009-9-9 04:55
本帖最后由 紫苏 于 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 可以分别引用到这三个字符串
作者: 瓦沙尔    时间: 2009-9-9 17:24
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1