gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:42:32 26 4
gpt4 key购买 nike

一个例子:

case Foo:
...
break;
case Bar:
...
break;
case More: case Complex:
...
break:
...


我想检索正则表达式 \(的所有正则表达式匹配项(整个匹配文本,甚至更好的是 \)case \([^:]*\):之间的部分),它应该在新的缓冲区中提供类似

Foo
Bar
More
Complex
...


用例的另一个示例是某些部分的提取,例如,从HTML文件提取图像的URL。

有没有一种简单的方法可以绘制所有正则表达式匹配并将其放在Vim的缓冲区中?

注意:它与问题 extract text using vim类似,但是我也有兴趣删除那些在没有庞大或复杂正则表达式的情况下不匹配的行。

最佳答案

有一种通用的方式来收集整个作品中的图案匹配
文字。该技术利用
:substitute命令的表达式功能
(请参见:help sub-replace-\=)。关键思想是使用替代
枚举所有模式匹配以评估表达式存储
他们没有更换。

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

另一个问题是如何避免在运行时修改文本
替代。一种方法是使模式始终具有
通过在\ze之前添加\zs原子或在其后附加:help /\zs原子来实现零宽度匹配
(请参见:help /\ze:help /zero-width)。以这种方式修改的图案
捕获在出现之前或之后的空字符串
文本中的原始图案(此类匹配称为零宽度匹配
在Vim中;参见add())。然后,如果替换文字也是
空的,替换实际上不会改变任何东西:它只是替换
零宽度匹配和空字符串。

由于t功能,以及大多数列表修改
函数,对于我们的技术,返回对更改后的列表的引用
要工作,我们需要以某种方式从中获取一个空字符串。最简单的
方法是通过指定范围从中提取长度为零的子列表
索引,以使起始索引大于结束索引。

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

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


执行后,将累积第一个子组的所有匹配项
在变量 =t引用的列表中,可以按原样使用,也可以使用
以某种方式处理。例如,粘贴列表一的内容
在插入模式下在单独的行上按一个,键入


Ctrl + R :put输入


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

:pu=t

关于regex - 如何使用Vim提取正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9079561/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com