Forum Programmation.perl [resolu] regexp qui ne marche pas, enfin pas toujours.

Posté par .
Tags :
2
6
déc.
2012

le texte que je cherche à nettoyer tout sur une seule ligne, au milieu d'un fichier que je parcours ligne à ligne :

 src="C2_Fr_OIITXD.jpg" pageID="1" width="1651" height="2335" Sender="Moi" Receiver="" Script="" Document_Location="" Category="2a" Document_Date="05/09/2013" Document_Object="Bon de livraison" Language="french" NumPage="2" Receiver_Address="une adresse avec un numero des espaces, des virgules" Receiver_Name="marie ubert" Phone="+33(0)1.22.33.44.55"

le code qui vide les champs
il fait ca avec tous les champs, j'utilise la meme logique sur chacun des champs

if ($_ =~ /(Sender=".*?")/)
 {
   $_=~ s/$1/Sender=""/;
 }
if ($_ =~ /(Phone=".*?")/)
 {
   $_=~ s/$1/Phone=""/;
 }

mon probleme ?

si un champs contient un + ou des () ca ne marche plus.
ex : le numero de telephone n'est pas vidé

mais j'ai essayé avec +tata ou (tata) dans un autre champs
il n'est alors pas vidé par le script.

  • # A tester

    Posté par (page perso) . Évalué à  0 .

    J'aurais testé sans le point d'interrogation qui me semble inutile mais bon mon niveau en regex est basique :-)

    • [^] # Re: A tester

      Posté par . Évalué à  2 .

      sans le ? il va matcher jusqu'au 2e " apres

      dans l'exemple
      Script="aaaa" Langue="bbbb"

      /Script="(.*)"/ va matcher
      Script=" aaaa" Langue="bbbb "

      alors qu'avec (.*?) il prendra
      Script=" aaaa " Langue="bbbb"

      • [^] # Re: A tester

        Posté par (page perso) . Évalué à  2 .

        Et comme ça ? Ça serait pas ce que tu cherches ? (pas besoin de if soit dit en passant)

        $_ =~ s/Sender="[^"]*"/Sender=""/;
        $_ =~ s/Phone="[^"]*"/Phone=""/;
        
        

        It's a fez. I wear a fez now. Fezes are cool !

        • [^] # Re: A tester

          Posté par . Évalué à  2 .

          oui le problème est du à l'évaluation de variable comme regex ($1) dans s/$1//, la solution du dessus (sans les if devrait marcher.)

          mais pour les regex j'ai une préférence pour les *? ou +? ?? qui sont a mon sens plus lisible (le ? derrière un *?+ ne rend non greedy )

          Il ne faut pas décorner les boeufs avant d'avoir semé le vent

        • [^] # Re: A tester

          Posté par . Évalué à  2 .

          pas mal

          j'ai simplifié sur ta proposition

          $_ =~ s/Sender=".*?"/Sender=""/;
          
          

          et j'ai testé ca marche.

          merci.

        • [^] # Re: A tester

          Posté par (page perso) . Évalué à  7 . Dernière modification : le 06/12/12 à 13:59

          Plusieurs remarques :

          • Les « $_ =~ » sont totalement superflus. Cela obscurcit même (pour quelqu'un qui a l'habitude de lire du perl)
          • Le tout est combinable en une seule regex avec le /g et des |
          s/(\w)="[^"]*"/$1=""/g;
          
          

          ou si la liste des trucs à remplacer est limitée

          s/(Sender|Phone)="[^"]*"/$1=""/g;
          
          

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.