2011-04-26 528 views
2

我试图删除从第二个字符到最后一个.word\模式(也删除点)的所有文本行,但在点之前可能没有\。如果在点之前有\,则删除直到之前的.word\模式。VIM:正则表达式 zs ze问题

我创造了这个简单的正则表达式:
^\w\zs.*[^\]\.\ze\w\+\\\s.*$
但这不起作用

我是怎么了?

如果我不想删除,直到最后.word\但是直到第二个.word\模式,代码会是什么?

数据:
nnoremenu <silent> 97.330.10 &Sort.Reverse\ Characters.Reverse\ Characters\ in\ Line\ Hor\ -[A]<Tab>sihT\ si\ ym\ txet\.\
nnoremenu <silent> 97.330.11 &Sort.Reverse\ Characters.Reverse\ Characters\ in\ Line\ Hor\ Reverse\ -[A]<Tab>\.txet\ ym\ si\ sihT\

必须是:
n Reverse\ Characters\ in\ Line\ Hor\ -[A]<Tab>sihT\ si\ ym\ txet\.\
n Reverse\ Characters\ in\ Line\ Hor\ Reverse\ -[A]<Tab>\.txet\ ym\ si\ sihT\

+2

一些示例数据可能会有帮助。 – johnny 2011-04-26 10:15:55

+3

有些数据是强制性的。你不能指望我们阅读(证明)错误的正则表达式,并猜测你的意思是不完整的描述 – sehe 2011-04-26 10:18:10

+0

@johnny,@sehe,请看上面 – Reman 2011-04-26 13:20:25

回答

2

你应该使用:

:%s/^\w\zs.*\\\@<!\.\ze\w\+\\\s 

注意,最终\s意味着你需要在最后一个反斜杠后的空间。

\@<!帮手意味着:lookbehind否定断言(请参阅:help /\@<!)。

另外请注意,最后.*$是无用的。

+0

谢谢。这解决了我的第一个问题。我们的正则表达式总是选择最新的模式'w \ + \\ s',选择第二个模式的代码是什么?体育如果我在文本p.e中搜索找到2个或更多空格。 '^ [a | v | n]。* \(\ s \ {2,} \)\ {1}',它会找到一行中的最后2个或更多个空格。如何搜索一行中的前两个或更多空格? – Reman 2011-04-26 13:27:12

+0

用途:'\(^。\ { - } \ {2,} \ @ = \)\ @> \ zs'。看到':help/\ @>'这些东西。 – Benoit 2011-04-26 13:29:37

+0

感谢Benoit,解决了我的问题。顺便说一句:为什么这不起作用:'^ [a | v | n]。* \(\ s \ {2,} \)\ {1}'是不是和你的代码一样?你的代码有效,我的代码不会:) – Reman 2011-04-26 14:57:03