Project1
标题:
什么是后向引用
[打印本页]
作者:
瓦沙尔
时间:
2009-9-9 03:57
提示:
作者被禁止或删除 内容自动屏蔽
作者:
紫苏
时间:
2009-9-9 04:55
本帖最后由 紫苏 于 2009-9-9 04:56 编辑
F1里面不是有例子吗……
正则表达式中如果有括号,那么括号中实际匹配成功的字符串就会被保存起来,而通过后向引用,就可以获取这些字符串的内容~后向引用有时可以起到节省正则表达式长度的作用——在表达式中经常会需要匹配固定的、重复的内容,这时可以在第一次匹配时把内容用括号括起来,第二次需要匹配相同内容时使用后向引用就行了
正则表达式中的 \1、\2、\3、……、\n 就是通过后向引用在表达式中按照序号获取括号中的内容,括号的顺序以左括号出现的先后排列~
例 1:
str = "11"
# 匹配成功
# [0-9] 匹配任意一个数字,紧跟着 \1 表示要这个匹配成功的数字再次出现一次
p /([0-9])\1/ =~ str
str = "12"
# 匹配失败
# 这时 \1 的内容是 "1","11" 当然不匹配 "12" 了
p /([0-9])\1/ =~ str
复制代码
注意后向引用引用的是实际成功匹配的字符串,而不是正则表达式原本的内容:上面的第二段代码中,虽然括号中是匹配 0-9 的任意数字,但后向引用后其实是实际成功匹配的 "1",而不是 再次匹配任意数字 "[0-9]"~正如上面所说,后向引用是用来匹配“固定的、重复的”内容的,而 [0-9] 显然并非匹配固定字符串……
例 2:
str = "helloworldhelloworldhellohelloworldworld"
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