Regex 如何使用正则表达式更改既不在开头也不在结尾的单词?

Regex 如何使用正则表达式更改既不在开头也不在结尾的单词?,regex,vim,Regex,Vim,所以我得到了这样的东西: word word word word word word word word word 我想要这个: word changed word word changed word word changed word 编辑(已解决) %s/word\(\w\\s\w\)\@=/changed/g 我相信有一种更简洁的方法可以做到这一点,它并不完美,因为我想当然地认为在这条线的开头没有空间。 但它是有效的,谢谢你的回答。如果你有以下数据,我学到了一些东西: word so

所以我得到了这样的东西:

word word word
word word word
word word word
我想要这个:

word changed word 
word changed word
word changed word
编辑(已解决)

%s/word\(\w\\s\w\)\@=/changed/g

我相信有一种更简洁的方法可以做到这一点,它并不完美,因为我想当然地认为在这条线的开头没有空间。 但它是有效的,谢谢你的回答。如果你有以下数据,我学到了一些东西:

word something else word
word stuff in here word
word other stuff in here word
您可以使用类似于
(word)(.*?\1
的匹配组来匹配第一个单词,匹配所有内容,直到再次找到第一个单词。然后可以使用匹配组2编辑该数据


但是你的问题真的没有任何意义。

使用负面环顾:

(?!<^)word(?!$)
(?!您可以使用:

:%s/ \w\+/ changed
它将替换所有第二列单词(假定一个空格作为列分隔符)。有关
:g
:s
命令的详细信息,请参阅
:help:g
:help:s
。如果第二列包含相同长度的单词,则可以使用分块替换(
=Ctrl+V)

gg0wgechanged

Meh,不要使用正则表达式:使用宏

qq^wciwchanged<Esc>q
qq^wciwchangedq
然后简单地用你喜欢的方式播放(
@q
,之后
@
工作;
:%normal!@q
:global/pat/normal!@q
,&c)

工作原理:

  • ^
    转到开头
  • w
    转到下一个单词(您可以使用
    3w
    转到第三个单词,以此类推)
  • ciwchanged
    然后点击escape更改单词

  • 我得到了您建议的使用此命令的确切输出:

    :%norm wcwchanged
    
    % ................. Whole file
    norm .............. normal mode
    w ................. jump to the second word
    cw ................ change word
    

    欢迎来到SO!如果一个问题没有意义,请在评论中提问,直到它有意义为止,然后尝试回答。回答一些你不理解的问题会产生噪音,对OP没有帮助,特别是当你评论“但你的问题真的没有意义”时最好在评论中的澄清问题中指出这一点。“”会有帮助。这与
    没有本质区别:%s/\w\+/changed/
    是的,这很有意义。无论如何,我这样做是为了学习正则表达式并习惯它们。
    :%norm wcwchanged
    
    % ................. Whole file
    norm .............. normal mode
    w ................. jump to the second word
    cw ................ change word