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

ojb*_*ass 36 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)

let var1 = a:str1

let 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     
Run Code Online (Sandbox Code Playgroud)

ENDFOR

endfunction这样

str*_*ger 70

:g/[ ^\t]if\|[ ^\t]fi/print
Run Code Online (Sandbox Code Playgroud)

BIGFATOROPERATOR\|.它被称为交替运算符.在PCRE中,很简单|.它在Vim/ex中|被转义,因为在别处用于一般命令(或者某些东西--FIXME).

  • 你实际上是在逃避吗?性格在那? (2认同)
  • 在我的辩护中,有很多噪音在寻找这些东西......而且我在这个过程中学到了很多东西. (2认同)

Fle*_*cle 14

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

%v/\(if\|else\|fi\)/d   
Run Code Online (Sandbox Code Playgroud)

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

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

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

使用"\ v"意味着在所有ASCII字符之后的模式中除了'0' - '9','a' - 'z','A' - 'Z'和'_'具有特殊含义."非常神奇"

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

不建议您在vimrc中将默认魔术级别设置为"非常"(如帮助文件说明).


Luc*_*tte 7

:h /\|
Run Code Online (Sandbox Code Playgroud)

如果你错过了\ |,你可能错过了许多其他模式 "令牌".