我正在尝试删除一系列以下格式的评论:
/**
* @ngdoc
... comment body (delete me, too!)
*/
我尝试过使用此命令:%s/\/**\n * @ngdoc.\{-}*\///g
以下是没有模式的正则表达式:%s/pattern1.\{-}pattern2//g
以下是各个模式:\/**\n * @ngdoc
和*\/
当我在vim中尝试我的模式时,我收到以下错误:
E871: (NFA regexp) Can't have a multi follow a multi !
E61: Nested *
E476: Invalid command
感谢您对此regexp噩梦的任何帮助!
答案 0 :(得分:2)
不是试图将其填充到一个复杂的正则表达式中,而是更容易搜索评论的开头并从那里删除到评论的结尾
:g/^\/\*\*$/,/\*\/$/d_
这分解为
:g start a global command
/^\/\*\*$/ search for start of a comment: <sol>/**<eol>
,/^\*\/$/ extend the range to the end of a comment: <sol>*/<eol>
d delete the range
_ use the black hole register (performance optimization)
答案 1 :(得分:1)
您的问题是\{-}
后跟*
,这是错误消息中引用的多重符号。引用*
:
%s/\/\*\*\n \* @ngdoc\_.\{-}\*\/\n//g
答案 2 :(得分:0)
在模式中使用嵌入式换行是错误的方法。您应该使用地址范围。类似的东西:
sed '\@^/\*\*$@,\@^\*/$@d' file
这将删除从第1列锚定的/**
匹配的第一行到第1列锚定的匹配*/
的行。如果您的注释表现良好(例如,{之后没有尾随空格) {1}}),这应该做你想要的。
答案 3 :(得分:0)
使用gc
尝试删除
%s/\v\/\*\*\n\s\*\s\@ngdoc\n((\s*\n)?(\s\*.*\n)?){-}\s?\*\///gc
匹配
等评论/**
* @ngdoc
* ... comment body (delete me, too!)
*
*/
答案 4 :(得分:0)
我接近的是使用宏:
qa/\/\*\*<enter><shift-v>/\*\/<enter>d
qa ........ starts recording macro "a"
/\/\*\* ... searches for the comment beginning
<Enter> ... use Ctrl-v Enter
V ......... starts visual block (until...)
/\*\/ ..... end of your comment
<Enter> ... Ctrl-v Enter agai
d ......... it will delete selected area
为了isert etc presse后跟你想要的关键字。