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

Posté par  .
Étiquettes :
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  (site web personnel) . É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  (site web personnel) . É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=""/;
        
        

        Being a sysadmin is easy. As easy as riding a bicycle. Except the bicycle is on fire, you’re on fire and you’re in Hell.

        • [^] # 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.

        • [^] # Commentaire supprimé

          Posté par  . Évalué à 7. Dernière modification le 06 décembre 2012 à 13:59.

          Ce commentaire a été supprimé par l’équipe de modération.

Suivre le flux des commentaires

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