反向引用(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 '[email protected]*<body>(.+)</body>.*@\[email protected]'

使用了正则的反向引用提取了<body></body>标签之间的内容,拿到了本机IP (Current IP Address: 115.29.207.231)。

思考一下,进一步提取,只想要后面的IP部分,应该怎么办?

练习题

抓出昵图网首页所有的图片超链接 (<img>标签中src这个field的内容),用命令或编程语言实现,并验证你的结果。