Vim中的正则表达式否定

时间:2012-03-26 21:09:47

标签: regex vim code-formatting

问题:

如何将var x+=1+2+3+(5+6+7)转换为var x += 1 + 2 + 3 + ( 5 + 6 + 7 )

详细说明:

使用正则表达式,:%s/+/\ x\ /g之类的内容将无效,因为它会将+=转换为+ =(以及其他问题)。所以相反,人们会使用否定(否定,不是,无论他们被称为什么),如:%s/\s\@!+/\ +/g,这就像人们可以说“加号之前没有空格”那样复杂。但现在,这会将x++之类的内容转换为x + +。我需要的是更复杂的东西。我在否定中需要多个约束,之后需要一个额外的约束。类似的东西,但这不起作用:%s/[\s+]\@!+\x\@!/\ +/g

有人可以提供一个或两个可以填充示例运算符的正则表达式语句,这样我就可以对其上的其余规则进行建模。

动机:

我发现像javascript或PHP这样的语言的美化者不能完全控制(参见here)。因此,我试图使用正则表达式执行以下转换:

  • foo(1,2,3,4)foo( 1, 2, 3, 4 )
  • var x=1*2*3var x = 1 * 2 * 3
  • var x=1%2%3var x = 1 % 2 % 3
  • var x=a&&b&&cvar x = a && b && c
  • var x=a&b&cvar x = a & b & c

任何反馈也将不胜感激

1 个答案:

答案 0 :(得分:0)

感谢很好的反馈,我现在有一个像这样的正则表达式。我正在运行这两个正则表达式:

:%s/\(\w\)\([+\-*\/%|&~)=]\)/\1\ \2/g
:%s/\([+\-*\/%|&~,(=]\)\(\w\)/\1\ \2/g

它运作得相当好。以下是一些结果。

(1+2+3+4,1+2+3+4,1+2+3+4) --> ( 1 + 2 + 3 + 4, 1 + 2 + 3 + 4, 1 + 2 + 3 + 4 )
(1-2-3-4,1-2-3-4,1-2-3-4) --> ( 1 - 2 - 3 - 4, 1 - 2 - 3 - 4, 1 - 2 - 3 - 4 )
(1*2*3*4,1*2*3*4,1*2*3*4) --> ( 1 * 2 * 3 * 4, 1 * 2 * 3 * 4, 1 * 2 * 3 * 4 )
(1/2/3/4,1/2/3/4,1/2/3/4) --> ( 1 / 2 / 3 / 4, 1 / 2 / 3 / 4, 1 / 2 / 3 / 4 )
(1%2%3%4,1%2%3%4,1%2%3%4) --> ( 1 % 2 % 3 % 4, 1 % 2 % 3 % 4, 1 % 2 % 3 % 4 )
(1|2|3|4,1|2|3|4,1|2|3|4) --> ( 1 | 2 | 3 | 4, 1 | 2 | 3 | 4, 1 | 2 | 3 | 4 )
(1&2&3&4,1&2&3&4,1&2&3&4) --> ( 1 & 2 & 3 & 4, 1 & 2 & 3 & 4, 1 & 2 & 3 & 4 )
(1~2~3~4,1~2~3~4,1~2~3~4) --> ( 1 ~ 2 ~ 3 ~ 4, 1 ~ 2 ~ 3 ~ 4, 1 ~ 2 ~ 3 ~ 4 )
(1&&2&&3&&4,1&&2&&3&&4,1&&2&&3&&4) --> ( 1 && 2 && 3 && 4, 1 && 2 && 3 && 4, 1 && 2 && 3 && 4 )
(1||2||3||4,1||2||3||4,1||2||3||4) --> ( 1 || 2 || 3 || 4, 1 || 2 || 3 || 4, 1 || 2 || 3 || 4 )
var x=1+(2+(3+4*(965%(123/(456-789))))); --> var x = 1 +( 2 +( 3 + 4 *( 965 %( 123 /( 456 - 789 )))));

除嵌套括号外,它似乎工作正常。如果我修复了嵌套括号问题,我会在这里更新它。