regex (Pattern) : pb synthaxe

regex (Pattern) : pb synthaxe - Java - Programmation

Marsh Posté le 04-07-2003 à 11:28:19    

Bonjour,
 
Je débute dans les regex des pattern et je n'arrive pas à traduire la regle suivante :
"prendre les mots qui commencent par ce mot-préfixe, et qui finissent par ce mot-suffixe, et qui ne contiennent pas ce sous-mot"
 
-----------
J'arrive seulement a traduire :
"prendre les mots qui commencent par ce mot-préfixe, et qui finissent par ce mot-suffixe, et qui ne contiennent pas ce caractère"
 
Pattern p = Pattern.compile("br[^y]*is" );
 
----------------
 
 
Si j'écris :
Pattern p = Pattern.compile("br[^yx]*is" );
 
ca ne marche pas car [^yx] signifie "ne pas prendre y OU x" (alors que je voudrais que ca signifie "ne pas prendre la chaine de caracteres yx"  
 
 
 
Merci pour vos conseils!
 

Reply

Marsh Posté le 04-07-2003 à 11:28:19   

Reply

Marsh Posté le 04-07-2003 à 11:37:17    

si je dis pas de conneris, il n'y a pas de négation dans les regexp (sauf exclusion de caractère)...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 04-07-2003 à 11:39:19    

et ^(xy)?


---------------
Le Tyran
Reply

Marsh Posté le 04-07-2003 à 11:40:02    


t'as pas le droit de faire ca je crois ...
mais bon, je connais vraiment pas bien :$


Message édité par benou le 04-07-2003 à 11:40:32

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 04-07-2003 à 11:41:06    

benou a écrit :

si je dis pas de conneris, il n'y a pas de négation dans les regexp (sauf exclusion de caractère)...  


 
Argh !  :cry:
Comment je peux faire ?
 (concaténation d'exclusion de caractères ? ...)

Reply

Marsh Posté le 04-07-2003 à 11:46:37    

Si Si ça ça marche: [^(xy)]
 
Ce qui donne:

Code :
  1. Pattern p = Pattern.compile("br[^(yx)]*is" );


Message édité par LetoII le 04-07-2003 à 11:47:25

---------------
Le Tyran
Reply

Marsh Posté le 04-07-2003 à 11:47:24    


 

Code :
  1. import java.util.regex.Pattern;
  2. import java.util.regex.Matcher;
  3. class Essai
  4. {
  5. public static void main(String[]args)
  6. {
  7.   Pattern p = Pattern.compile("br[^y]*is" );
  8.   Matcher m = p.matcher("abrebiysxyzxbrebisa" );
  9.   boolean b = m.matches();
  10.   while(m.find())
  11.   {
  12.    System.out.println("P="+m.group());
  13.   }
  14. }
  15. }


 
 
Là, ca affiche "brebis" (une fois).C'est normal.
 
Mais avec  

Code :
  1. Pattern p = Pattern.compile("br[^yx]*is" );


ca affiche également "brebis" (une fois) (car exclusion du caractere y OU x) alors que je voudrais deux fois (exclusion de la chaine yx).
 

Reply

Marsh Posté le 04-07-2003 à 11:48:07    

(désolé si mon exemple est difficile à lire  :ange: )

Reply

Marsh Posté le 04-07-2003 à 11:50:50    

pilou50 a écrit :


 

Code :
  1. import java.util.regex.Pattern;
  2. import java.util.regex.Matcher;
  3. class Essai
  4. {
  5. public static void main(String[]args)
  6. {
  7.   Pattern p = Pattern.compile("br[^y]*is" );
  8.   Matcher m = p.matcher("abrebiysxyzxbrebisa" );
  9.   boolean b = m.matches();
  10.   while(m.find())
  11.   {
  12.    System.out.println("P="+m.group());
  13.   }
  14. }
  15. }


 
 
Là, ca affiche "brebis" (une fois).C'est normal.
 
Mais avec  

Code :
  1. Pattern p = Pattern.compile("br[^yx]*is" );


ca affiche également "brebis" (une fois) (car exclusion du caractere y OU x) alors que je voudrais deux fois (exclusion de la chaine yx).
 
 


 
CF ma réponse plus haut


---------------
Le Tyran
Reply

Marsh Posté le 04-07-2003 à 12:02:11    

LetoII a écrit :


 
CF ma réponse plus haut


 
ca ne marche pas .
ca affiche qu'une fois brebis alors que ca devrait l'afficher deux fois.

Reply

Marsh Posté le 04-07-2003 à 12:02:11   

Reply

Marsh Posté le 04-07-2003 à 13:03:58    

LetoII a écrit :


 
CF ma réponse plus haut


 

Code :
  1. import java.util.regex.Pattern;
  2. import java.util.regex.Matcher;
  3. class Essai
  4. {
  5. public static void main(String[]args)
  6. {
  7.   Pattern p = Pattern.compile("br[^(xy)]*is" );
  8.   Matcher m = p.matcher("abrebyisxyzxbrebisa" );
  9.   boolean b = m.matches();
  10.   while(m.find())
  11.   {
  12.    System.out.println("P="+m.group());
  13.   }
  14. }
  15. }


 
Ca n'affiche qu'une fois "brebis" alors que ce message devrait apparaître deux fois.   :(

Reply

Marsh Posté le 04-07-2003 à 13:08:58    

Effectivement ça marche pas, ça ça marche: "br((x[^y])|([^x]))*is"


---------------
Le Tyran
Reply

Marsh Posté le 04-07-2003 à 16:21:40    

Pour clore le débat je dirais qu'il n'existe pas de moyen en UNE expression regulière de faire un "sauf un mot".
Pour t'en tu peux faire un :
 Pattern p = Pattern.compile("br(.)*is" );  
Ensuite tu recupere l'element du groupe 0 en fait ce qui est autore des parenthese et tu compare à "iy". si c'est faux ta chaine correspond sinon elle ne correspond pas.

Reply

Marsh Posté le 04-07-2003 à 16:29:11    

phnatomass a écrit :

Pour clore le débat je dirais qu'il n'existe pas de moyen en UNE expression regulière de faire un "sauf un mot".
Pour t'en tu peux faire un :
 Pattern p = Pattern.compile("br(.)*is" );  
Ensuite tu recupere l'element du groupe 0 en fait ce qui est autore des parenthese et tu compare à "iy". si c'est faux ta chaine correspond sinon elle ne correspond pas.
 


 
 :heink: J'ai donné une solution qui marche en une expression


---------------
Le Tyran
Reply

Marsh Posté le 04-07-2003 à 18:31:47    

LetoII a écrit :


 :heink: J'ai donné une solution qui marche en une expression


ok, mais si le mot dont tu ne veux pas fait 20 lettres, tu vas e chier :/
 
c'estvraiment trop nul qu'il y ait pas de "not" dans les regexp :/
 


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 04-07-2003 à 23:55:37    

benou a écrit :


ok, mais si le mot dont tu ne veux pas fait 20 lettres, tu vas e chier :/
 
c'estvraiment trop nul qu'il y ait pas de "not" dans les regexp :/
 
 


 
Pas plus que si tu devais faire l'automate qui corspond à l'expression régulière  [:ddr555]


---------------
Le Tyran
Reply

Marsh Posté le 05-07-2003 à 00:32:29    

LetoII a écrit :


Pas plus que si tu devais faire l'automate qui corspond à l'expression régulière  [:ddr555]  


n'empeche que c'est nul :o


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 07-07-2003 à 09:43:07    

Cette exception est levée quand je mets :
((<[^!])|([^<]))*  (tous les mots sauf ceux qui contiennent "<!" )
 à la place de
[^!]* (tous les mots sauf ceux qui contiennent "!" )
 
 

Code :
  1. Exception in thread "main" java.lang.StackOverflowError
  2.         at java.util.regex.Pattern$Branch.match(Pattern.java:3860)
  3.         at java.util.regex.Pattern$GroupHead.match(Pattern.java:3900)
  4.        at java.util.regex.Pattern$Loop.match(Pattern.java:4028)
  5.         at java.util.regex.Pattern$GroupTail.match(Pattern.java:3959)
  6.         at java.util.regex.Pattern$GroupTail.match(Pattern.java:3959)
  7.         at java.util.regex.Pattern$NotSingle.match(Pattern.java:2956)
  8.         at java.util.regex.Pattern$GroupHead.match(Pattern.java:3900)
  9.         at java.util.regex.Pattern$Branch.match(Pattern.java:3860)

Reply

Marsh Posté le 07-07-2003 à 11:08:46    

belle erreur :D


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 07-07-2003 à 11:10:53    

DarkLord a écrit :

belle erreur :D


 
.. Merci merci...  :sol:  
 
N'empêche...  :(

Reply

Marsh Posté le 07-07-2003 à 11:15:17    

pilou50 a écrit :


 
.. Merci merci...  :sol:  
 
N'empêche...  :(  


 
oui :(


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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