正则表达式-回溯引用-单词边界?

3
为了理解正则表达式中的反向引用,我通过书籍《精通正则表达式(第3版)》创建了一个包含以下两行的文件:

the the

the theft

之后,我尝试执行以下命令:
:g/\([a-zA-Z]\+\) \1

所以它向我展示了两行,很明显原因是什么。

之后我尝试通过仅捕获第一行来限制结果。

:g/\(\<[a-zA-Z]\+\>\) \1

即使在括号内放置分隔符\<\>,它也向我显示了两行。 下面的命令可以做到所需的(仅显示第一行):

:g/\<\([a-zA-Z]\+\) \1\>

任何解释为什么括号内的分隔符没有效果吗?
谢谢

2
你正在使用第一个捕获组的字面匹配进行反向引用。任何零宽度断言都不会被考虑在内,没有单词边界,没有起始/结束锚点,也没有向后或向前查找。 - Sebastian Proske
1个回答

2
当你使用\(\<[a-zA-Z]\+\>\)时,它匹配的是the。需要知道的一件事是,单词边界是零宽度的。它们只能用于检查某些条件(例如这里的单词边界),但不能保存在任何捕获组中。捕获组只会保存匹配到的数据,而不包括任何断言。

因此,当你使用\1进行反向引用时,它不会记住单词边界。

相反,你必须使用

:g/\(\<[a-zA-Z]\+\>\) \<\1\>

引用自这里的单词边界定义:

有三个不同的位置被认为是单词边界:

在字符串中第一个字符之前,如果第一个字符是单词字符。

在字符串中最后一个字符之后,如果最后一个字符是单词字符。

在字符串中两个字符之间,其中一个是单词字符,另一个不是单词字符。


请详细解释一下正则表达式中的 \<\> 的作用是什么? - gaganso
抱歉,我不是楼主。 - gaganso
@SilentMonk 是的..我忘了..名字有点混淆..很高兴能帮到你。 - rock321987

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接