赞 | 2 |
VIP | 143 |
好人卡 | 1 |
积分 | 1 |
经验 | 216792 |
最后登录 | 2019-10-10 |
在线时间 | 24 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 61
- 在线时间
- 24 小时
- 注册时间
- 2008-8-5
- 帖子
- 1924
|
本帖最后由 紫苏 于 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 可以分别引用到这三个字符串 |
|