Aide sur les regexp de Perl

Aide sur les regexp de Perl - Perl - Programmation

Marsh Posté le 14-11-2002 à 21:43:28    

Je cherche a mettre en place une fonction de filtrage en Perl a l'aide de ses expressions regulieres.
 
J'ai donc besoin d'une regexp utilisee dans un if pour faire ca:
 - faux pour une chaine qui contient la sequence 'ti',
 - vrai sinon.
 
(par exemple 'tata' est bon, 'tati' et 'tita' ne sont pas bons).
 
Je peux faire ca: /[a-su-z][a-hj-z]/ mais je me demande si on pourrait pas definir un ensemble et lui dire "tout sauf 't' et 'i'" (comme on fait en math pour les ensembles 'R-{5}' -> l'ensemble des reels sans 5).
 
Merci d'avance
 
 

Reply

Marsh Posté le 14-11-2002 à 21:43:28   

Reply

Marsh Posté le 14-11-2002 à 21:59:16    

Code :
  1. /ti/


 
c'est pas equivalent a ta regexp ?
 

Reply

Marsh Posté le 14-11-2002 à 22:10:06    

impulse a écrit a écrit :

Code :
  1. /ti/


 
c'est pas equivalent a ta regexp ?
 




 
non justement je veux une regexp qui qui permet de laisser passer toutes les chaines de caracteres sauf celles qui contiennent la sequence 'ti'.


Message édité par physis le 14-11-2002 à 22:11:23
Reply

Marsh Posté le 14-11-2002 à 22:40:23    

Citation :

non justement je veux une regexp qui qui permet de laisser passer toutes les chaines de caracteres sauf celles qui contiennent la sequence 'ti'.

 
 
Euh... tu pourrais pas prendre le pb ds l'autre sens :
 
Si la chaine contient "ti" ...
Sinon ...

Reply

Marsh Posté le 14-11-2002 à 23:01:57    

la raison pour laquelle je veux utiliser une seule regexp c'est que cette expression va etre mise dans un fichier ini a partir duquel le script viendra chercher son filtre.
 
du coup il me suffira de changer cette exp seulement dans le fichier ini au lieu de me balader dans le source du script.
 
en gros je cherche un truc comme un fait en maths quand on definit des ensembles sans qq points, genre R-{5,9}.
 
ya pas une regexp pour decrire "[a-z] sans {t,i}" ?

Reply

Marsh Posté le 14-11-2002 à 23:03:21    

je sais qu'on peut utiliser la negation dans une regexp
pour la syntaxe, c'est une autre histoire

Reply

Marsh Posté le 15-11-2002 à 09:29:03    

En fait, si tu as une chaine contenant "tata toto tati", tu ne veux récupérer que "tata toto" ou bien récupérer TOUT sauf "ti" (comme ici : "tata toto ta" ) ?
 
CAS 1 : virer toute chaîne contenant titi

Code :
  1. $string = "tata toto tati titi";
  2. @_ = split(/ /, $string);
  3. $string = "";
  4. foreach my $mot(@_) {
  5.     if ($mot !~ /ti/) {
  6.         $string .= " $mot" if ($string);
  7.         $string .= $mot if (! $string);
  8.     }
  9. }


résultat : $string contient désormais "tata toto"
 
CAS 2 : supprimer toute séquence de 2 lettres == "ti"

Code :
  1. $string = "tata toto tati titi";
  2. while($string =~ /^(.*)ti(.*)$/) {
  3.     $string = $1 . $2;
  4. }


résultat : $string contient désormais "tata toto ta "
 
Je précise : les 2 exemples ci-dessus sont montrés clairement (du - j'espère !) mais il y a moyen de faire + efficace, en étant + propre, mais aussi (c'est mon avis) en faisant moins clair pour la compréhension
 
Zut, j'arrête po d'éditer mon post   :whistle:  
 
Pour le CAS 2 : on peut aussi faire sacom :
 

Code :
  1. $string = "tata toto tati titi";
  2. $string =~ s/ti//g;


Message édité par Aricoh le 15-11-2002 à 09:33:20

---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO
Reply

Marsh Posté le 15-11-2002 à 11:35:25    

merci aricoh de m'aider mais ce que tu m'as fourni n'est pas tout a fait c eque je cherche: je ne cherche qu'une regexp et pas un moreceau de code.
 
je m'explique: cette regexp est destinee a etre placee dans un fichier d'initialisation que l'on modifiera a souhait pour effectuer des operations de filtrage sur une liste de fichiers, sans avoir a modifier le script perl.
 
ayant une liste de fichiers, je veux accepter certains fichiers (notamment tous ceux qui correspondent au pattern defini avec cette regexp), donc ceux qui sont du type 'xxxxxxti.xxx' et 'xxxxxxtu.xxx' ne doivent pas etre acceptes.

Reply

Marsh Posté le 15-11-2002 à 12:06:56    

Code :
  1. /t(?:[^i]|$)|[^t]/g

Reply

Marsh Posté le 15-11-2002 à 12:14:55    

physis a écrit a écrit :

je m'explique: cette regexp est destinee a etre placee dans un fichier d'initialisation que l'on modifiera a souhait pour effectuer des operations de filtrage sur une liste de fichiers, sans avoir a modifier le script perl.



 
Ok, alors dans ce cas, il faudrait que ton fichier d'initialisation contienne la liste des mots-clés à bannir/accepter uniquement
 
Ensuite, te reste plus qu'à exécuter le script Perl en lui fournissant la dite liste des mots clés via @ARGV


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed