Pb (surement tout con) avec une expression régulière (tte conne)

Pb (surement tout con) avec une expression régulière (tte conne) - Java - Programmation

Marsh Posté le 18-09-2002 à 09:29:15    

G un peu honte de poster ça, ms j'comprend vraiment pas là :
je veux virer tous les caractères non numériques d'une chaine de char.
Pour ça, la solution la + simple que g trouvé, c d'utiliser une expression régulière (du jdk 1.4).
Donc je fait ça :

Code :
  1. String regex = "[^+-1234567890]";
  2. return (_strValue.replaceAll(regex, "" ));


 
et je fait un test où _strValue vaut £1.50a0,00
Et je me rend compte que les '.' et les ',' sont conservés.
 
...Une expliquation ?

Reply

Marsh Posté le 18-09-2002 à 09:29:15   

Reply

Marsh Posté le 18-09-2002 à 10:09:56    

Ben a priori, je trouve ça logique, puisque tu ne les a pas listés dans ton expression régulière...  :heink:

Reply

Marsh Posté le 18-09-2002 à 10:21:34    

C peut être pas standard, mais en Java, [^abc] ça équivaut à n'importe quel caractère exepté a, b, et c.

Reply

Marsh Posté le 18-09-2002 à 10:35:02    

El_Gringo a écrit a écrit :

C peut être pas standard, mais en Java, [^abc] ça équivaut à n'importe quel caractère exepté a, b, et c.




 
tu es sûr?


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

Marsh Posté le 18-09-2002 à 10:41:42    

DarkLord a écrit a écrit :

 
 
tu es sûr?




 
extrait de javadoc :

Character classes  
[abc] a, b, or c (simple class)  
[^abc] Any character except a, b, or c (negation)  
[a-zA-Z] a through z or A through Z, inclusive (range)  
[a-d[m-p]] a through d, or m through p: [a-dm-p] (union)  
[a-z&&[def]] d, e, or f (intersection)  
[a-z&&[^bc]] a through z, except for b and c: [ad-z] (subtraction)  
[a-z&&[^m-p]] a through z, and not m through p: [a-lq-z](subtraction)  


Message édité par El_gringo le 18-09-2002 à 10:42:00
Reply

Marsh Posté le 18-09-2002 à 10:42:40    

D'ailleurs,  il me vire bien '£' et les lettres !

Reply

Marsh Posté le 18-09-2002 à 10:44:14    

[^...] c'est un truc standard, ça.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 18-09-2002 à 10:47:54    

bin donc tout va bien ...


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

Marsh Posté le 18-09-2002 à 10:50:07    

bin non, tout va pas bien !
Sinon je posterai pas.
quand en entrée j'ai "£1.50a0,00 "
je retrouve "1.500,00" en sortie.
Bref, on dirait qu'il me supprime pas les '.' et les ','

Reply

Marsh Posté le 18-09-2002 à 10:52:54    

Bizarre en effet.
Sinon les ; sont bien supprimés.

Reply

Marsh Posté le 18-09-2002 à 10:52:54   

Reply

Marsh Posté le 18-09-2002 à 10:55:53    

ce serait pas le + qui serait mal interprété ?

Reply

Marsh Posté le 18-09-2002 à 11:03:33    

bingo:
 

Code :
  1. String _strValue="£1.50a0,00plouf\rplonk,paf;paf";
  2. String regex = "[^1234567890-[+]]";
  3. System.out.println(_strValue.replaceAll(regex, "" ));

Reply

Marsh Posté le 18-09-2002 à 11:06:50    

a propos qqun as t il une meilleure regex pour représenter une adresse email?
 

Code :
  1. /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-]+)+/


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

Marsh Posté le 18-09-2002 à 11:11:23    

DarkLord a écrit a écrit :

a propos qqun as t il une meilleure regex pour représenter une adresse email?
 

Code :
  1. /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-]+)+/






 
Email validator that adheres directly to the specification for email address naming. It allows for everything from ipaddress and country-code domains, to very rare characters in the username.
  ^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$  
 
trouvée sur http://www.regxlib.com

Reply

Marsh Posté le 18-09-2002 à 11:12:34    

krosso a écrit a écrit :

bingo:
 

Code :
  1. String _strValue="£1.50a0,00plouf\rplonk,paf;paf";
  2. String regex = "[^1234567890-[+]]";
  3. System.out.println(_strValue.replaceAll(regex, "" ));






 
Yesss, excellent, merci beaucoup.
Les expression régulières, c puissant, ms du coup, c assez comlpexe à utiliser.

Reply

Marsh Posté le 18-09-2002 à 11:27:13    

krosso a écrit a écrit :

 
 
Email validator that adheres directly to the specification for email address naming. It allows for everything from ipaddress and country-code domains, to very rare characters in the username.
  ^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$  
 
trouvée sur http://www.regxlib.com




 
 
 :eek2: ça arrache ! Merci ;)


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

Marsh Posté le 18-09-2002 à 11:37:14    

mais ça marche pô :(
 
Je dois retrouver une adresse email dans un texte quelconque et l'email peut par exemple etre contenue entre paranthèse, genre
 
(toto@tutu.com) ou 'toto@tutu.com'
 
une idée?
 
Edit: j'ai rien dit. C'est ma faute visiblement parce que meme avec toto@tutu.com tout seul il trouve pas ...


Message édité par darklord le 18-09-2002 à 11:57:53

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

Marsh Posté le 18-09-2002 à 11:39:40    

DarkLord a écrit a écrit :

mais ça marche pô :(




ah ouais, le truc c'est un validateur, pas un matcher.
Faut peut-être le faire en deux fois:
Un matcher pas trop restricitf qui capture des chaines ressemblant à des emails.
Puis on passe la chaine trouvée au validateur.

Reply

Marsh Posté le 18-09-2002 à 11:40:10    

El_Gringo a écrit a écrit :

G un peu honte de poster ça, ms j'comprend vraiment pas là :
je veux virer tous les caractères non numériques d'une chaine de char.
Pour ça, la solution la + simple que g trouvé, c d'utiliser une expression régulière (du jdk 1.4).
Donc je fait ça :

Code :
  1. String regex = "[^+-1234567890]";
  2. return (_strValue.replaceAll(regex, "" ));


 
et je fait un test où _strValue vaut £1.50a0,00
Et je me rend compte que les '.' et les ',' sont conservés.
 
...Une explication ?




Bon, j'arrive après la guerre, mais est-ce-que

Code :
  1. [^-0-9+]


ne marcherait pas mieux (en plus c'est plus simple!)
D'après moi, le problème vient de la place du '-'. En effet, placé entre 2 caractères, il indique la plage de caractères qui s'étend du caractère précédent le '-' au caractère suivant. Ainsi, [0-9] prend tous les caractères de 0 à 9. Si l'on veut inclure le caractères '-' dans une classe de caractères, on place  le '-' en début de liste. Cette explication me semble d'autant plus plausible que les caractères dont les codes ASCII sont situés entre le '+' et le '1' sont: ',' '-' '.' '/' et '0'.
 
Essaie ça et tiens moi au courant STP...

Reply

Marsh Posté le 18-09-2002 à 11:40:27    

krosso a écrit a écrit :

 
ah ouais, le truc c'est un validateur, pas un matcher.
Faut peut-être le faire en deux fois:
Un matcher pas trop restricitf qui capture des chaines ressemblant à des emails.
Puis on passe la chaine trouvée au validateur.
 




 
ah oki ct le matcher que je cherchais moi ;)


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

Marsh Posté le 18-09-2002 à 12:03:24    

grrr je trouve pas. Quelqu'un a une idée pour une expression régulière qui pourrait trouver (pas valider) une adresse email parmis un texte libre ...


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

Marsh Posté le 18-09-2002 à 12:30:17    

DarkLord a écrit a écrit :

grrr je trouve pas. Quelqu'un a une idée pour une expression régulière qui pourrait trouver (pas valider) une adresse email parmis un texte libre ...



Code :
  1. \s([-a-z0-9_.]+@[-a-z0-9_.]+\.(net|com|fr|org))\s


Pas dit que ça détecte tout (domaines étrangers (.de, .be, etc.), par exemple), mais ce peut être un début...

Reply

Marsh Posté le 18-09-2002 à 12:32:32    

merci et j'ai ouvert un topic
 
http://forum.hardware.fr/forum2.php3?post=26023&cat=10


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

Marsh Posté le 18-09-2002 à 18:00:09    

Désolé, j'avais fumé. Et toucouch a trouvé la vraie raison (signification particulière du '-' pour les intervalles).
 
Au fait, tant que j'y suis, l'expression régulière "[^1234567890-[+]]" est certainement incorrecte car elle doit conserver les crochets...
La bonne doit donc bien être "[^-0-9+]", comme l'a indiqué toucouch (on doit aussi pouvoir écrire "[^-+0-9]" ou "[^+\\-0-9]" )

Reply

Marsh Posté le 18-09-2002 à 18:21:07    

BifaceMcLeOD a écrit a écrit :

La bonne doit donc bien être "[^-0-9+]", comme l'a indiqué toucouch (on doit aussi pouvoir écrire "[^-+0-9]" ou "[^+\\-0-9]" )




 
Oui, c'est bien ça!

Code :
  1. String regex = "[^-+0-9]";

Reply

Marsh Posté le 19-09-2002 à 14:05:14    

Toucouch a écrit a écrit :

 
Bon, j'arrive après la guerre, mais est-ce-que

Code :
  1. [^-0-9+]


ne marcherait pas mieux (en plus c'est plus simple!)
D'après moi, le problème vient de la place du '-'. En effet, placé entre 2 caractères, il indique la plage de caractères qui s'étend du caractère précédent le '-' au caractère suivant. Ainsi, [0-9] prend tous les caractères de 0 à 9. Si l'on veut inclure le caractères '-' dans une classe de caractères, on place  le '-' en début de liste. Cette explication me semble d'autant plus plausible que les caractères dont les codes ASCII sont situés entre le '+' et le '1' sont: ',' '-' '.' '/' et '0'.
 
Essaie ça et tiens moi au courant STP...




 
hé ouais, t'as surement raison.
Ms l'expression régulière de krosso marchait aussi.
Merci à vous tous !

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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