regex - 如何删除一行中匹配项之间的所有文本?

标签 regex search vim replace

我有这个问题:

输入文字:

this is my text text text and more text
this is my text myspace this is my text
this space is my text space this is my
this is my text this is my text
this space is my text space space myspace

假设我想搜索“空间”
我想将其作为输出:

this is my text text text and more text
space
space space
this is my text this is my text
space space space space

同一行的匹配必须用空格分隔。
没有匹配项的行必须保持原样。

对于所有其他搜索项也是如此。

今天下午我试图实现这一点,但没有成功。
谁能帮帮我?

最佳答案

解决方案:

:g/space/s/\(.*space\).*$/\1/|s/.\{-}space/space/g|s/^//

说明:

这很棘手,但可以做到。但是,它不能使用单个正则表达式来完成。

我们做的第一件事是在最后一场比赛之后摆脱任何东西(我们实际上利用了正则表达式默认情况下贪婪的事实):

s/\(.*space\).*$/\1/

然后我们删除所有内部匹配之间的任何内容(注意我们在这里使用 * 的惰性版本,\{-}):

s/.\{-}space/ space/g

上一步会在结果中留下一个初始空间,所以我们去掉它:

s/^ //

幸运的是,在 vim 中,我们可以使用 | 字符将替换链接在一起。所以,把它们放在一起:

:g/space/s/\(.*space\).*$/\1/|s/.\{-}space/ space/g|s/^ //

关于regex - 如何删除一行中匹配项之间的所有文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17495995/

相关文章:

macos - 无法在 vim 中安装 FuzzyFinder

ruby-on-rails - Ruby Regexp#match with capture 返回 String 而不是 MatchData

javascript - 查找 javascript 文件中的所有字符串变量

vim - 如何在 VIM 中按字母顺序对方法进行排序?

php - MYSQL按同一单元格中的多个值过滤?

ios - VFR 阅读器搜索功能

css - 使用 vi,如何删除所有包含 [searchterm] 的行?

regex - 如何在绑定(bind)表达式中使用正则表达式文字?

javascript - 从 RGBA(r,g,b,a) 中提取 RGB(r,g,b) 的正则表达式

search - 抓握模式不方便的结果汇编