正则表达式 - 反向引用 - 单词分隔符?

时间:2016-06-05 12:02:40

标签: regex vim backreference

为了通过掌握正则表达式,第3版这本书来理解反向引用,我创建了一个包含以下两行的文件:

  

     

盗窃

之后我尝试执行此命令:

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

所以它向我展示了两条线,很明显为什么

之后我试图通过仅捕捉第一行来限制结果

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

即使将单词的分隔符\< \>放在括号内,它也向我显示了两行。 下面的命令执行所需的操作(仅显示第一行):

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

为什么括号内的分隔符没有效果?

由于

1 个答案:

答案 0 :(得分:2)

  

当您使用\(\<[a-zA-Z]\+\>\)时,它与the匹配。有一点要知道单词边界是zero-width。它们只能用于检查某些条件(例如此处的单词边界),但它们无法保存在任何捕获组中。捕获组仅保存匹配的数据,而不是任何断言。

     

因此,当您使用\1对其进行反向引用时,它不记得单词边界。

相反,你提到的,你必须使用

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

here

引用字边界

有三种不同的职位符合词边界:

  

在字符串中的第一个字符之前,如果第一个字符是a   字符。

     

字符串中的最后一个字符后,如果是最后一个字符   character是一个单词字符。

     

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

相关问题