Vim正则表达式,反向引用`[^ ​​s]`匹配

时间:2012-12-12 02:36:18

标签: regex vim backreference

在包含以下内容的文件中:

self.phrase
self.phrases
self.phrase.lower()
self.phrase_lowered
self.phrases[self.phrase]

我想将所有self.phrase替换为self._phraseself.phrases除外:

self._phrase
self.phrases
self._phrase.lower()
self._phrase_lowered
self.phrases[self._phrase]

在我试过的正则表达式中,第一个(我认为可行的正则表达式)是:

:%s/self\.phrase[^s]/self\._phrase\1/gc

但它不起作用。

3 个答案:

答案 0 :(得分:7)

使用\>标记单词的结尾:

1,$s/self\.phrase\>/self._phrase/g

答案 1 :(得分:4)

通常用负向前瞻表示而不是像[^s]那样的原子:

%s/self\.phrases\@!/self._phrase/g

。在\zs / \ze或后台搜索的帮助下,您可以缩小要输入的字符范围:

%s/self\.\zs\zephrases\@!/_/g

%s/\v(self\.)@<=(phrases@!)@=/_/g

(虽然后者只比原版少1个字符。)

答案 2 :(得分:1)

要让您的反向引用工作,请使用捕获组:

:%s/self\.phrase\([^s]\)/self\._phrase\1/gc

然而,正如@gits指出的那样,这并不能解决您的问题。我个人会建议使用@perreal的答案。它更灵活,因此更有可能在未来工作。但如果您决定采用上述方法,那么以下内容将起作用:

%s/self\.phrase\([^s]\|\s*$\)/self\._phrase\1/gc