【发布时间】:2012-01-31 12:33:40
【问题描述】:
考虑以下示例:
case Foo:
...
break;
case Bar:
...
break;
case More: case Complex:
...
break:
...
假设,我们想要检索正则表达式 case \([^:]*\): 的所有正则表达式匹配(整个匹配文本,或者更好的是,\( 和 \) 之间的部分),这应该给我们(最好在新缓冲区)类似:
Foo
Bar
More
Complex
...
另一个用例示例是从 HTML 文件中提取某些部分,例如,图像的 URL。
有没有一种简单的方法来绘制所有正则表达式匹配并将它们放入 Vim 的缓冲区中?
注意:类似于问题“How to extract text matching a regex using Vim?”。但是,与该问题中的设置不同,我也有兴趣删除不匹配的行,最好不要使用庞大或复杂的正则表达式。
【问题讨论】:
-
你的意思是反向引用吗?
:%s/^\vcase ([^:]+):/\1/使用\1获取第一个捕获组。 -
如果您只想将这些提取到一个新文件中(您的问题不清楚),您可以使用 sed 或 grep 更轻松地完成此操作; sed 示例:
sed -n '/^\s*case\s\+/{s/\s*case\s\+\([^:]\+\):/\1/;p}' file -
@beerbajay:是的,在新文件中没问题。我同意 sed 会做得很好,只是我必须启动命令提示符并再次找到该文件,所以我正在寻找 Vim 解决方案。
-
@mathematical.coffee:一点也不。问题不在于搜索和替换(除非您包含新行),而是抓取所有匹配项并将它们放入另一个缓冲区。
-
这与这个问题非常相似:stackoverflow.com/questions/4503748/…
标签: regex vim match text-extraction