是否有一个像样的Vim regexp OR命令?找不到匹配的最佳方法是什么?

时间:2009-03-25 02:30:32

标签: regex vim

我在脚本中有一些不匹配的if和fi语句。除了if's else's和fi's之外,我想删除所有内容。就这样我可以看到结构。为什么这么强大的编辑器如此努力?我需要一个 BIGFATOR 运算符来进行正则表达式或一些我已经躲过的顿悟...我不关心正则表达式上的pontification只是在VIM7.2中实际工作的东西。

  

:g / [^ \ t] if [/ print

将打印出ifs

  

:g / [^ \ t] fi / print

将打印出fi

我想做的是或条件

:g / [^ \ t] fi BIGFATOROPERATOR [^ \ t] fi / print

我做了以下成功...但我觉得我工作太难了!

  

:调用TripMatch('[^ \ t] * if [','else','fi [\ t $]')

     

功能! TripMatch(str1,str2,str3)

     

让var1 = a:str1

     

让var2 = a:str2

     

让var3 = a:str3

     

让max = line(“$”)

     

让n = 1

     

表示范围内的n(1,最大值)

     

让currentline = getline(n)

if currentline =~? var1

   echo n "1:" currentline

else

   if currentline =~? var2

      echo n "2:" currentline

   else

      if currentline =~? var3

         echo n "3:" currentline

      else

         let foo = "do nothing"

      endif

   endif

endif     
     

ENDFOR

     

endfunction可写

3 个答案:

答案 0 :(得分:69)

:g/[ ^\t]if\|[ ^\t]fi/print

BIGFATOROPERATOR \|。它被称为alternation operator。在PCRE中,它是普通的|。它在Vim / ex中被转义,因为|在其他地方用于一般命令(或者某些东西--FIXME)。

答案 1 :(得分:14)

如果你想删除除if,else或fi之外的所有其他行,你可以使用这个

%v/\(if\|else\|fi\)/d   

'v'与'g'相反,将删除任何与正则表达式不匹配的行。

添加到strager所说的管道字符'|'在Vim中被转义,我想是因为Vim假设你会更频繁地寻找文字字符,而不是需要大量的RegExps。

在ex模式下,通过将'magic'级别设置为'very',可以让Vim使用较少的转义RegExps:

  

“\ v”的使用意味着在模式中   在它之后的所有ASCII字符除外   '0' - '9','a' - 'z','A' - 'Z'和'_'有   一个特殊的意义。 “非常神奇”

请参阅:他/ magic了解更多信息

不建议您在vimrc中将默认魔术等级设置为“非常”(如帮助文件中所述)。

答案 2 :(得分:7)

:h /\|

如果你错过了\ |,你可能错过了许多其他pattern“令牌”。