嗨:我有一个已经被问到的问题的后续问题。较早的一个已在下面的链接中处理
在那篇文章中,问题是删除除模式之外的所有内容。在提供的示例中,提问者想要删除除“文本”一词之外的所有内容。所以对于以下输入
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
...和朋友的单行。
谢谢
仔细观察后,我认为弱点是使用
.\{-}
,因为它确实包含部分模式(即尾随数字)。如果我改为使用 [^0-9]\{-}
,即排除数字,那么看起来以下补救措施有效!!
:%s/\(^\|\(text\d\+\)\@<=\)[^0-9]\{-}\($\|text\d\+\)\@=//g
特别是现在我明白了
text1
text2text34
text100
这就是我所追求的。
任何反馈表示赞赏;任何变体解决方案也将不胜感激。
谢谢