2010-03-20 4 views
6

J'ai l'intention de changer les smileys en images. Ici, il estexclusion d'expression rationnelle

(?:(?![0]:\)|:\)\)|:-\)\)))(:\)|:-\)) 

Le point est de ne pas changer 0 :) et :)) et :-)) tout en changeant :) :-) et Il fonctionne très bien avec :)) et :-)) mais en quelque sorte toujours attrape :) dans 0 :)

Où est mon erreur?

Répondre

5

Vous voulez faire correspondre :) et :-), mais ils ne doivent pas être précédée par 0 ou suivie d'une autre )? Alors ceci est le modèle:

(?<!0):-?\)(?!\)) 

Fondamentalement, il est

(?<!0) : negative lookbehind; must not be preceded by 0 
:-?\) : smiley with optional nose 
(?!\)) : negative lookforward; must not be followed by) 

Exemple:

$ echo ':) :-) ok 0:) :)) :-)) 0:-)) 0:-) :)' | \ 
> perl -lne'print $1 while /(?<!0)(:-?\))(?!\))/g' 
:) 
:-) 
+0

J'ai ajouté exemple en Perl. – jfs

+0

Oh ouais, vous devez être gourou regexp. Cela fonctionne bien, merci! – Vlad