2010-07-28 105 views
1

我有一堆字符串,看起来像这样:'../DisplayPhotod6f6.jpg?t=before&tn=1&id=130',我想拿出问号后的所有东西,看起来像'../DisplayPhotod6f6.jpg'小vim正则表达式

s/\(.\.\.\/DisplayPhoto.\{4,}\.jpg\)*'/\1'/g 

这个正则表达式捕获一些但不是全部的出现,你能明白为什么吗?

+2

你能给一个错过的例子吗? – 2010-07-28 19:02:40

+0

Amardeep,它错过了''../DisplayPhotocef3.jpg?t=before & tn = 1 & id = 54'',''../DisplayPhotod6f6.jpg?t=before & tn = 1 & id = 130'' , 还有很多。 – nnyby 2010-07-28 19:11:42

+0

第一个“。”的用途是什么?在组的开始?它可以替换为“'”(单引号)吗? – matias 2010-07-28 20:21:29

回答

1

我会用宏,有时比正则表达式(和互动)简单:

qa 
/DisplayPhoto<Enter> 
f?dt' 
n 
q 

然后一些@a,或[email protected]去,虽然所有行。

4

\.\{4,}正试图匹配4个或更多.个字符。看起来像你想要的是“匹配任何字符4或更多”(.\{4,}),但“匹配4个或更多非.字符”([^.]\{4,})可能更准确。由于*目前适用于整个\(\)组,因此您还需要将该模式末尾的唯一*更改为.*

+0

哦,哦..谢谢! – nnyby 2010-07-28 19:08:16

+0

奇怪它仍然不工作''../DisplayPhotocef3.jpg?t=before & tn = 1 & id = 54'' – nnyby 2010-07-28 19:10:46

1

下面的正则表达式:/(\.\./DisplayPhoto.*\.jpg)/gi

对下面的例子测试:

../DisplayPhotocef3.jpg?t=before&amp;tn=1&amp;id=54 
../DisplayPhotod6f6.jpg?t=before&amp;tn=1&amp;id=130 

将导致:

../DisplayPhotocef3.jpg 
../DisplayPhotod6f6.jpg 
+0

这是PCRE,它不同于Vim的正则表达式。 – jamessan 2010-07-29 03:32:54

3

我觉得去这个easyest方法是:

s/?.*$/'/g 

这就是说:删除问号后面的所有内容,并用单引号替换它。

0
%s/\('\.\.\/DisplayPhoto\w\{4,}\.jpg\).*'/\1'/g 

一些注意事项:

  • %将导致掉在所有行工作。
  • \ w而不是'。',以防万一有一些格式不正确的文件名。
  • 替换'。'在匹配正则表达式开始时,'正是它应该匹配的东西。