有一个像样的 Vim 正则表达式 OR 命令吗?查找不匹配的 if else 的最佳方法是什么?

问题描述 投票:0回答:3
我的脚本中有一些不匹配的 if 和 fi 语句。我想去掉除了 if 、 else 和 fi 之外的所有内容。这样我就可以看到结构了。为什么要与如此强大的编辑器如此努力地工作?我需要一个用于正则表达式的

BIGFATOR 运算符,或者一些我一直没有意识到的顿悟......我不关心正则表达式的武断,只是在 VIM7.2 中实际工作。

:g/[ ^ ]if [/print

将打印出 ifs

:g/[ ^ ]fi/打印

将打印出 fi

我想做的是或者条件

:g/[ ^ ]fi

大操作员 [ ^ ]fi/print

我已经成功地做到了以下几点...但我觉得我工作太努力了!

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

功能! TripMatch(str1, str2, str3)

让 var1 = a:str1

让 var2 = a:str2

让 var3 = a:str3

让 max = line("$")

令 n = 1

对于 (1, max) 范围内的 n

让当前行= 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
  
  
结束

结束功能

regex vim
3个回答
91
投票
:g/[ ^\t]if\|[ ^\t]fi/print

BIGFATOROPERATOR\|

。它被称为
交替运算符。在 PCRE 中,它很简单 |
。它在 Vim/ex 中被转义,因为 
|
 在其他地方用于通用命令(或某些东西 - FIXME)。


22
投票
如果您想删除除 if、else 或 fi 之外的所有其他行,您可以使用此

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

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

添加 strager 所说的管道字符“|”在 Vim 中被转义,我想是因为 Vim 假设你寻找文字字符的频率比你需要大量正则表达式的频率要高。

在 ex 模式下,您可以通过将 'magic' 级别设置为 'very' 来使 Vim 使用更少的转义正则表达式:

使用“”表示在模式中 之后的所有 ASCII 字符除外 '0'-'9'、'a'-'z'、'A'-'Z' 和 '_' 有 有特殊的意义。 “非常神奇”

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

不建议您在 vimrc 中将默认魔法级别设置为“very”(如帮助文件所述)。


10
投票
:h /\|
如果您错过了

\|

,您可能已经错过了许多其他
模式“标记”。

© www.soinside.com 2019 - 2024. All rights reserved.