如何使用Vim提取正则表达式匹配

Wer*_*ght 16 regex vim text-extraction match

样品:

case Foo:
    ...
    break;
case Bar:
    ...
    break;
case More: case Complex:
    ...
    break:
...
Run Code Online (Sandbox Code Playgroud)

我想取回所有正则表达式匹配(整个匹配的文本,甚至更好,之间的部分\(\)正则表达式的),case \([^:]*\):应该给像(在新新的文件):

Foo
Bar
More
Complex
...
Run Code Online (Sandbox Code Playgroud)

用例的另一个例子是从HTML文件中提取某些部分,比如图像URL.

有没有一种简单的方法来绘制所有RegEx匹配并将它们放在Vim的缓冲区中?

注意:它类似于使用vim提取文本,但我也有兴趣删除不匹配的行,最好没有庞大或复杂的RegEx.

ib.*_*ib. 24

在一段文本中有一种收集模式匹配的一般方法.该技术利用:substitute命令的表达式特征替换(参见参考资料:help sub-replace-\=).关键思想是使用枚举枚举所有模式匹配来评估存储它们而无需替换的表达式.

首先,让我们考虑保存比赛.为了保持一系列匹配的文本片段,使用列表很方便(参见参考资料:help List).但是,由于无法:let在表达式(包括\=替换表达式)中运行Ex命令,因此无法使用该命令直接修改列表.但是,我们可以调用其中一个修改列表的函数.例如,该add()函数旨在将给定项附加到指定列表(请参阅参考资料:help add()).

另一个问题是如何在运行替换时避免文本修改.一种方法是通过预先添加\ze或通过\zs向其添加原子来使模式始终具有零宽度匹配(参见:help /\zs,:help /\ze).以这种方式修改的模式捕获文本中原始模式出现之前或之后的空字符串(这种匹配在Vim 中称为零宽度匹配;请参阅参考资料:help /zero-width).然后,如果替换文本也是空的,则替换实际上不会改变任何内容:它只是用空字符串替换零宽度匹配.

由于add()函数以及大多数列表修改函数返回对已更改列表的引用,为了使我们的技术起作用,我们需要以某种方式从中获取空字符串.最简单的方法是通过指定一系列索引来从中提取零长度的子列表,使得起始索引大于结束索引.

结合上述想法,我们获得以下Ex命令.

:let t=[] | %s/\<case\s\+\(\w\+\):\zs/\=add(t,submatch(1))[1:0]/g
Run Code Online (Sandbox Code Playgroud)

在执行之后,第一个子组的所有匹配都累积在变量引用的列表中t,并且可以按原样使用或以某种方式处理.例如,要在"插入"模式下在单独的行上逐个粘贴列表的内容,请键入

Ctrl+R=tEnter

要在普通模式下执行相同操作,只需使用以下:put命令:

:pu=t
Run Code Online (Sandbox Code Playgroud)