第八章 回溯引用:前后一致匹配
8.1 回溯引(backreference)用有什么用
8.2 回溯引用匹配
回溯引用允许正则表达式模式引用前面的匹配结果。
回溯引用指的是模式在后半部分引用在前半部分中定义的子表达式。
\后面的数字代表的是第几个子表达式。
备注:回溯引用只能用来引用模式里的子表达式(用(和)括起来的正则表达式片段)
提示:回溯引用匹配通常从1开始计数(\1,\2等)。在许多实现里,第0个匹配(\0)可以用来代替整个正则表达式。
注意:如果子表达式的相对位置发生了变化,整个模式也许就不能再完成原来工作,删除和添加子表达式的后果可能更严重。
为了弥补这一不足:一些比较新的正则表达式实现还支持“命名捕获(named capture)”:给某个子表达式起一个唯一的名字,然后用这个名字(而不是相对位置)来引用这个子表达式。
例子:把文本里所有连续重复出现的单词(打字错误,其中一个单词输入两遍)找出来。
【在搜索某个单词出现第二次的时候,这个单词必须是已知的】
[ ]+([\w+])+[ ]+\1
例子:匹配HTML标题
<[hH]([1-6])>.*?</[hH]\1>
8.3 回溯引用在替换操作中的应用
替换操作需要用到两个正则表达式:
一个是用来给出搜索模式;
另一个用来给出匹配文本的替换模式;
备注:回溯引用可以跨模式使用,在第一个模式里被匹配的子表达式可以用在第二个模式里。
回溯引用语法在不同的正则表达式实现里有很大的差异,用到时候需要查询相关文档。
例子:在用户信息数据库里,电话号码被记录为313-555-1234的格式,现在需要把电话号码重新排版为(313)-555-1234格式(模式)
搜索模式(正则表达式):(\d{3})(-)(\d{3})(-)(\d{4})
替换模式:($1)-$3-$5
提示:在对文本进行重新排版的时候,把文本分解成多个子表达式的作法往往非常有用,这可以让我们对文本的排版效果做出更精确的控制
8.3.1 大小写转化
例子:把一级标题(<H1>.......<H1>)的标题文字转换为大写
搜索模式:(<[hH]1>)(.*?)(</[hH]1>)
替换模式:$1\U$2\E$3