Regex 正则表达式在VI中的搜索和替换

Regex 正则表达式在VI中的搜索和替换,regex,vim,Regex,Vim,我有一份文件,里面有很多。。。。。在里面。我想删除所有这些。键入时使用vi :%s/\<swf[^\/swf>]+\/swf\>//g :%s/\]+\/swf\>//g 我希望这能起作用,但它与任何东西都不匹配。这里的问题是[]是一个字符类,所以您告诉它,在swf开始和结束标记之间,字母s,w和f不能以任何顺序出现在任何地方 您可以尝试非贪婪匹配: \<swf.\{-}\/swf\> \ 请注意,默认情况下不允许换行 我不使用Vim,所以我用它来发现语法。

我有一份文件,里面有很多。。。。。在里面。我想删除所有这些。键入时使用vi

:%s/\<swf[^\/swf>]+\/swf\>//g
:%s/\]+\/swf\>//g

我希望这能起作用,但它与任何东西都不匹配。

这里的问题是
[]
是一个字符类,所以您告诉它,在swf开始和结束标记之间,字母
s
w
f
不能以任何顺序出现在任何地方

您可以尝试非贪婪匹配:

\<swf.\{-}\/swf\>
\
请注意,
默认情况下不允许换行


我不使用Vim,所以我用它来发现语法。我希望这是正确的

您可以使用以下命令从缓冲区中删除所有内容:

:%s!<swf.\{-}/swf>!!
如果您只想删除标记并保留内容,那么假设您想删除标记及其包含的内容

:%s!</\?swf.\{-}>!!
:%s!!!
注:

  • 您不需要转义
  • 您可以选择您想要的任何模式定界符:Vim将使用您在替换命令中放置在
    s
    之后的第一个字符:这消除了在模式中转义前斜杠的需要
编辑:在您的评论之后扩展我的答案

  • 这与/STRING/REPLACE/g完全一样,我只使用了
    而不是
    /
    ,这样我就不必在模式中引用反斜杠(参见上面的第二点)
  • 我没有在末尾添加
    g
    修饰符,因为我在
    .vimrc
    中设置了gdefault,这意味着默认情况下,Vim将替换一行中的所有匹配项,而不仅仅是第一个,从而恢复
    /g
    的含义)
  • \{-}
    *
    量词的“ungreedy”版本,即它匹配前面的0个或多个原子,但尽可能少地使用——这有助于确保搜索模式将扩展到第一个“结束标记”,而不是最后一个

HTH

谢谢谢谢,那真是一种享受!!但我很好奇,如果不使用/STRING/REPLACE/g格式,这是如何工作的?{-}是什么意思?更新了我的答案,并详细介绍了你的评论
:%s!</\?swf.\{-}>!!