vim正则表达式与方括号不匹配

时间:2013-06-04 10:37:51

标签: regex vim

使用vim,我试图转换以下两行

  output reg [1:0] abcd,
  output reg efgh,

abcd
efgh

我正在使用正则表达式

:%s/\voutput|reg|\s*|\[.*\]|,//g

但是,我得到了输出,

[1:0]abcd,
efgh,

感谢任何帮助!谢谢。

6 个答案:

答案 0 :(得分:3)

试试这个

\v\[.*]\s+|output\s+|reg\s+

答案 1 :(得分:3)

$xbd0

将在一条线上完成工作。你可以录制一个宏来自动在多行上进行。

答案 2 :(得分:3)

:help pattern给出了理由(尽管从预先暴露于不同的可能性中猜到了原因有很大帮助: - )

  

1. A pattern is one or more branches, separated by "\|". It matches anything      that matches one of the branches. Example: "foo\|beep" matches "foo" and      matches "beep". If more than one branch matches, the first one is used.

Vim的正则表达式匹配器是第一匹配引擎。 POSIX要求最左边的时间。纯粹主义者可能认为其他任何东西都不是正则表达式匹配器,而只是一个“模式匹配器”,这可能与vim称之为“模式”有关... sedperl是最长的:

$ sed -r 's/output|reg|\s*|\[.*\]|,//g' @@
abcd
efgh
$ perl -ple 's/output|reg|\s*|\[.*\]|,//g' @@
abcd
efgh

但是使用第一匹配引擎你必须做一些不同的事情。重新排序您的替代品,它的工作原理:

:%s/\voutput|reg|\[.*\]|,|\s*//g

\s*替换为\s+会使其对订单不敏感:

:%s/\voutput|reg|\s+|\[.*\]|,//g

Vim的g标志似乎取代了第一个匹配分支的每次出现,然后重试,直到没有任何变化。

只是为了完整和混乱,

:%s/\v(reg|output|\s*|\[.*\]|,)*//
abcd,
efgh,

:%s/\v(reg|output|\s*|\[.*\]|,)*//g
abcd
efgh
根据上面推导出的规则,对我来说实际上对我有意义。

(编辑:gawk s gensubnvi s extended引擎显然也是最长时间的

答案 3 :(得分:1)

正则表达式中的问题是您要求\ s *的部分。这意味着“没有或许多空白”。由于整个正则表达式是一个大的OR,然后Vim将开始消耗你的字符串,直到它找到至少一个空格。当发生这种情况时,它将再次从OR的开头开始匹配并重复该过程。因此,这意味着在\ s *之后尝试接收的任何表达式都将被忽略,因为\ s *可以消耗尽可能多的表达式,直到找到空白字符。要验证这一点,请注意,如果更改\ s *的位置,您将得到不同的结果,这样只会消除\ s *之前的表达式。

我相信你真正想要的正则表达式是:

:%s/\voutput|reg|\s+|\[.*\]|,//g

表示您要替换至少有空格的地方。这对我来说很好。

答案 4 :(得分:1)

你的正则表达式无效的原因。

似乎vim从左到右读取正则表达式并尝试按顺序匹配联合的每个部分。

所以output|reg|\s*|\[.*\]|,永远不会到达\[.*\],因为空字符串与每个字符之间的\s*匹配。由于vim正则表达式引擎匹配的东西,它立即进行替换。

如果您只是重新排序\s*的联合,那么正则表达式将按预期工作。

所以命令应该是:%s/\voutput|reg|\[.*\]|,|\s*//g

答案 5 :(得分:0)

这样可行(在结尾附近查找4个字母):

%s/^.*\<\(\a\{4}\),\s*$/\1/g