Vim搜索:避免评论中的匹配

时间:2016-02-10 18:29:37

标签: python regex vim

使用vim搜索功能,是否可以避免在注释块/行上进行匹配。

作为一个例子,我想匹配' image'在这个python代码中,但只在代码中,而不是在注释中:

# Export the image
if export_images and i + j % 1000 == 0:
export_image(img_mask, "images/image{}.png".format(image_id))
image_id += 1

使用正则表达式我会这样做:/^[^#].*(image).*/gm 但它似乎不适用于vim。

3 个答案:

答案 0 :(得分:6)

您可以使用

/^[^#].*\zsimage\ze

\zs and \ze分别表示匹配的开始和结束。

  
      
  • 设置匹配的开始和结束:\zs \ze
  •   

请注意,这不会匹配一行中的几个“图像”,只是最后一个。

另外,或许,一个“消极的向前看”会比一开始时被否定的角色类更好:

/^#\@!.*\zsimage\ze
  ^^^^

#\@!等于Python中的(?!#)

并且因为后视在Vim中是非固定宽度like (?<=pattern) in Perl, but Vim allows non-fixed-width patterns),所以您可以将所有出现的字符序列 image 与< / p>

/\(^#\@!.*\)\@<=image

最后在缩进的注释行上跳过匹配图片,您只需要匹配可选(零个或多个)空白符号( s)在行的开头:

\(^\(\s*#\)\@!.*\)\@<=image
   ^^^^^^^^^^^   

\(\s*#\)\@!相当于Python (?!\s*#)(匹配后如果没有后跟零或更多的空格,后跟#)。

答案 1 :(得分:5)

This mailing list post建议使用folds

  

仅在打开的折叠(展开的文字)中搜索:

:set fdo-=search

要折叠#条评论,请调整this Vi and Vim post(其中给出了autocmd的Python文件):

set foldmethod=expr foldexpr=getline(v:lnum)=~'^\s*#'

但是,默认情况下折叠仅适用于多行。您需要enable folding of a single line,才能排除单行注释:

set fml=0

折叠完所有内容后zM,因为我没有其他任何内容需要折叠),搜索/image与评论中的任何内容都不匹配。

答案 2 :(得分:0)

一种更通用的忽略行尾注释标记内的匹配的方法(这不能解决避免使用文字字符串定界符的更复杂的情况,如果需要,可以通过一种简单的情况来实现):

/\v%(^.{-}\/\/.{-})@<!<%(this|that|self|other)>

位置:

  • /是用于执行搜索的 ex 命令(如果将正则表达式用作另一个命令或vimscript表达式的一部分,则删除。)
  • \v强制为此正则表达式使用"very magic"
  • \/\/是行尾注释标记(已转义,因此/字符不会被vim解释为正则表达式的结尾)。上面的示例适用于C / C ++,JavaScript,Node.JS等。
  • (^.{-}\/\/.{-})@<!zero-width表达式,表示“此之后的表达式开头之前不应有任何注释”(请参阅​​vim's documentation for \@<!)。在我们的例子中,该表达式只是试图在行中的任意点(因此^.{-})找到行尾注释令牌,并确保零-width 匹配可以终止于该表达式之后的正则表达式的第一个字符(由带括号的表达式末尾的.{-}实现)。
  • <%(this|that|self|other)>可以用任何正则表达式替换。在这种情况下,这表明您可以在此时匹配任意表达式,而不必担心注释(由该注释之前的 zero-width 表达式处理)。

作为示例,请考虑以下代码:

some.this = 'hello'
  some.this = 'hello' + this.someother;
 some.this = 'hello' + this.someother; // this is a comment, and this is another

上面的表达式将匹配所有this个单词,但注释内的单词(或与此相关的任何其他//前缀的注释除外)。

(注意:所有指向vim-7.0 reference documentation的链接,在撰写本文时,这些链接也应该(并且在我自己的测试中也是如此)在最新的vim和nvim版本中也有效)