反向引用(backreferences)
反向引用是正则表达式中一个高级用法,对分组之后的pattern进行再利用,比如拼接更复杂的pattern, 或者提取匹配到的pattern。
反向引用需要配合分组使用。之前的范例我们已经可以看出分组的一个用途——对分组的pattern进行整体匹配, 如(abc)?。
DFA
类型正则不支持反向引用
反向引用是分组的第二种用途,来看看下面这个范例:
echo 讨论讨论 | grep -oE '(.+)\1'
讨论讨论
echo 高高兴兴 | grep -oE '(.+)\1'
高高
兴兴
对匹配到的分组进行再引用时称为反向引用,通常使用\
+分组号来确定。
如\1
代表引用第一个分组,\2
代表引用第二个分组,以此类推。
看看这个例子:
curl -s http://ddns.oray.com/checkip | sed -r 's@.*<body>(.+)</body>.*@\1@'
使用了正则的反向引用提取了<body></body>
标签之间的内容,拿到了本机IP
(Current IP Address: 115.29.207.231
)。
思考一下,进一步提取,只想要后面的IP部分,应该怎么办?
练习题
抓出昵图网首页所有的图片超链接
(<img>
标签中src
这个field的内容),用命令或编程语言实现,并验证你的结果。