删除图案以外的任何内容(版本 2)

问题描述 投票:0回答:1

嗨:我有一个已经被问到的问题的后续问题。较早的一个已在下面的链接中处理

删除图案以外的任何内容

在那篇文章中,问题是删除除模式之外的所有内容。在提供的示例中,提问者想要删除除“文本”一词之外的所有内容。所以对于以下输入

this is my text this
is my text this is my text
my text is this

输出应该是

text
texttext
text

提供的解决方案非常优雅,并且似乎无缝运行

:%s/\(^\|\(text\)\@<=\).\{-}\($\|text\)\@=//g

唯一的问题是,现在假设所追求的模式不是恒定的“文本”,而是可变的真实模式。

例如考虑以下修改后的输入

this is my text1 this
is my text2 this is my text34
my text100 is this

现在我想删除所有内容,除了提到“文本”后跟一堆整数的内容。案件的结果应该是

text1
text2text34
text100

仅保留了

text\d\+
。我尝试了上述配方,并对模式进行了所需的修改,包括末尾的数字,但不幸的是它似乎不起作用。我特别尝试过

:%s/\(^\|\(text\d\+\)\@<=\).\{-}\($\|text\d\+\)\@=//g

但结果并不完全正确!!

text1
text2text3
text1

请注意,text34 已缩减为 text3,text100 已缩减为 text1。有办法解决这个问题吗?

P.S——setreg 的同一篇文章中的另一个建议的解决方案——我怀疑,尽管我还没有厌倦——应该可行。但它确实需要一些临时步骤,而且我的偏好 - 如果可能的话 - 是使用

\@=, \@<=, \zs
...和朋友的单行。

谢谢

vim pattern-matching
1个回答
0
投票

仔细观察后,我认为弱点是使用

.\{-}
,因为它确实包含部分模式(即尾随数字)。如果我改为使用
[^0-9]\{-}
,即排除数字,那么看起来以下补救措施有效!!

:%s/\(^\|\(text\d\+\)\@<=\)[^0-9]\{-}\($\|text\d\+\)\@=//g

特别是现在我明白了

text1
text2text34
text100

这就是我所追求的。

任何反馈表示赞赏;任何变体解决方案也将不胜感激。

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.