回溯引用的语法是使用反斜杠加上数字 \n
来引用先前的捕获组,其中 n
是捕获组的编号或者命名捕获组的名称。
如果捕获组通过圆括号进行了编号,可以使用 \n
来引用捕获组中的内容,其中 n
是捕获组的编号(从 1 开始)。
示例:
(\w+)\s+\1
这个正则表达式将匹配连续出现的相同单词,因为 \1
引用了第一个捕获组中捕获的内容。
解释:
(\w+)
:捕获一个或多个单词字符。\s+
:匹配一个或多个空白字符。\1
:引用第一个捕获组中捕获的内容,确保这部分文本再次出现。示例代码(Python):
import re
pattern = r'(\w+)\s+\1'
test_string = 'apple apple orange banana'
matches = re.findall(pattern, test_string)
for match in matches:
print(match)
输出:
('apple', 'apple')
命名捕获组可以更清晰地标识捕获内容,语法是 (?P<name>...)
来定义捕获组的名称,然后使用 (?P=name)
来引用这个命名捕获组。
示例:
(?P<word>\w+)\s+(?P=word)
这个正则表达式同样匹配连续出现的相同单词,但是使用了命名捕获组。
解释:
(?P<word>\w+)
:命名捕获组 word
,捕获一个或多个单词字符。\s+
:匹配一个或多个空白字符。(?P=word)
:引用命名捕获组 word
中捕获的内容。示例代码(Python):
import re
pattern = r'(?P<word>\w+)\s+(?P=word)'
test_string = 'apple apple orange banana'
matches = re.findall(pattern, test_string)
for match in matches:
print(match)
输出:
('apple', 'apple')
回溯引用特别适用于需要匹配重复的模式,例如连续出现的相同单词或者字符序列。
示例:
(\w+)\s+\1
这个表达式可以匹配连续出现的相同单词,例如 apple apple
。
回溯引用也可以用来匹配对称结构,例如 HTML 标签中的嵌套。
示例:
<(div|p)>(.*?)<\/\1>
这个表达式可以匹配 <div>
或 <p>
标签中的内容,确保结束标签与开始标签匹配。
在替换文本中,回溯引用可以用来捕获和替换重复的内容,例如删除连续重复的单词或者调整对称结构中的内容。