为了通过掌握正则表达式,第3版这本书来理解反向引用,我创建了一个包含以下两行的文件:
盗窃
之后我尝试执行此命令:
:g/\([a-zA-Z]\+\) \1
所以它向我展示了两条线,很明显为什么
之后我试图通过仅捕捉第一行来限制结果
:g/\(\<[a-zA-Z]\+\>\) \1
即使将单词的分隔符\<
\>
放在括号内,它也向我显示了两行。
下面的命令执行所需的操作(仅显示第一行):
:g/\<\([a-zA-Z]\+\) \1\>
为什么括号内的分隔符没有效果?
由于
答案 0 :(得分:2)
当您使用
\(\<[a-zA-Z]\+\>\)
时,它与the
匹配。有一点要知道单词边界是zero-width
。它们只能用于检查某些条件(例如此处的单词边界),但它们无法保存在任何捕获组中。捕获组仅保存匹配的数据,而不是任何断言。因此,当您使用
\1
对其进行反向引用时,它不记得单词边界。
相反,你提到的,你必须使用
:g/\(\<[a-zA-Z]\+\>\) \<\1\>
从 here
引用字边界有三种不同的职位符合词边界:
在字符串中的第一个字符之前,如果第一个字符是a 字符。
字符串中的最后一个字符后,如果是最后一个字符 character是一个单词字符。
字符串中的两个字符之间, 其中一个是单词字符而另一个不是单词字符。