2010-07-28 4 views
1

J'ai un tas de chaînes qui ressemblent à ceci: '../DisplayPhotod6f6.jpg?t=before&tn=1&id=130', et je voudrais tout sortir après le point d'interrogation, pour ressembler à '../DisplayPhotod6f6.jpg'.Little vim regex

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

Cette regex capture certaines occurrences mais pas toutes, voyez-vous pourquoi?

+2

Pouvez-vous donner un exemple d'occurrence manquée? –

+0

Amardeep, il a manqué ' '../DisplayPhotocef3.jpg?t=before & tn = 1 & id = 54'','' ../DisplayPhotod6f6.jpg?t=before & tn = 1 & id = 130'' , beaucoup plus. – nnyby

+0

Quel est le but du premier "." au début du groupe? Pourrait-il être remplacé par un "'" (guillemet simple)? – matias

Répondre

1

J'utiliser des macros, parfois plus simples que regexp (et interactive):

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

Et puis certains @a, ou [email protected] aller si toutes les lignes.

4

\.\{4,} essaie de trouver 4 ou plus de . caractères. Ce que vous voulez, c'est "correspondre à 4 ou plus de n'importe quel caractère" (.\{4,}) mais "correspondre à 4 caractères ou plus non ." ([^.]\{4,}) peut être plus précis. Vous devrez également changer le seul * à la fin du modèle à .* puisque le * s'applique actuellement à l'ensemble du groupe \(\).

+0

oh duh .. Merci! – nnyby

+0

bizarre ça ne fonctionne toujours pas pour ''../DisplayPhotocef3.jpg?t=avant & tn = 1 & id = 54'' – nnyby

1

L'expression rationnelle suivante: /(\.\./DisplayPhoto.*\.jpg)/gi

testé contre exemples suivants:

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

entraînera:

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

C'est PCRE, ce qui est différent de l'expression rationnelle de Vim. – jamessan

3

Je pense que la easyest voie à suivre pour cela est:

s/?.*$/'/g 

Cela dit: supprimez tout après le point d'interrogation et remplacez-le par un seul guillemet.

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

Quelques notes:

  • % provoquera l'échange de travailler sur toutes les lignes.
  • \ w au lieu de '.', Au cas où il y aurait des noms de fichiers malformés.
  • Remplacer '.' au début de votre regex correspondant avec 'ce qui est exactement ce qu'il devrait correspondre.
Questions connexes