回溯引用的语法是使用反斜杠加上数字 \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> 标签中的内容,确保结束标签与开始标签匹配。
在替换文本中,回溯引用可以用来捕获和替换重复的内容,例如删除连续重复的单词或者调整对称结构中的内容。