Vim reg表达式和别名方法

时间:2012-06-24 23:43:36

标签: regex vim

我已经学习了vim并且开始看到它有多强大(特别是与reg表达式相结合)。 现在我正在尝试用浮动值替换python文件中的所有整数。 例如。你会想到[0,0,0]这些需要[0.0,0.0,0.0]

的东西

我现在最好的是: :%S / \(\ d + \)\ @< = S *,/ 0,/克 虽然我正在产生0.032.0

的结果

两件事:

  1. 你们中的任何人都可以用一种强有力的方法来解决上述问题吗?
  2. 我开始看到这些表达式有多复杂。无论如何说在我的.vimrc中定义subregex表示整数或浮点数,并且有办法将它嵌入以后的调用中。例如所需的调用可能是:%s / \($(AnInt)\)+ / - / g在整数转换为减号后更改加号。 (那或类似的模块化)

1 个答案:

答案 0 :(得分:4)

假设你得到的结果“像0.032.0”是因为你从0.032开始

注意,这是当您尝试强制使用正则表达式而没有其他任何内容来解析非常规语言时会发生的情况。有许多边缘情况,这个正则表达式失败。我将在尝试时对其进行说明。

:%s/\(\[.*\)\@<=\([0-9]\+\)\(,[^,]*\.[^,]*\)\@<!\.\@!\(.*\]\)\@=/\2.0/cg

这是如何运作的?

首先,我想确保我在一个数组中。 \(\[.*\)\@<=

这是一个搜索文字[

的lookbehind断言

这将在多行指定的列表上失败,并且在这种情况下也会失败(它将匹配3和4):

for (i,j,k) in zip([0, 0, 0], range(3), listOfLists[4]):

这为复杂性做出了折衷。请仔细检查所有比赛,以确保您没有做出您不想做的事情。

接下来,我想实际匹配文字,\([0-9]\+\)简单。

接下来,我想确保数字之前或之后没有任何点,但忽略逗号之前和之后的内容。 \(,[^,]*\.[^,]*\)\@<!

接下来,我想确保比赛后没有文字句号。 \.\@!

最后,我想确保匹配后某处有一个文字](以确保我在一个数组内。\(.*\]\)\@=

然后最后但并非最不重要的是我用第二个捕获的组替换找到的文本并添加一个句点。

至于你的#2,不,但你可以将这些区域划入命名的粘贴缓冲区并随意使用它们。使用命令编辑模式q: