Page 1 sur 2

Expressions régulières, ça fonctionne ENFIN !

Posté : 27 août 2005, 18:26
par PhilFree
Bonjour à tous,

J'aimerais remplacer toute une série de "if" par une expression régulière.

Mais ne les ayant jamais utilisées, j'ai beaucoup de peine à rédiger cette maudite expression, pourriez-vous me donner un coup de pouce ?

Voici le code que j'aimerais remplacer par une expression régulière:
// test de la validité des caractères - élimination des caractères interdits
// caractères autorisés: 0-9 A-E TN $-:/*.+ (24 caractères aut.) 
for ( i = 0 ; i < dtalgth ; i++ )  {
		tmp  = valeur.substr( i, 1 ) ;
		tmp2 = tmp.charCodeAt( 0 ) ;

		if((tmp2 >= 48) && (tmp2 <= 57)) {	//	***** [0]..[9]
				hr += tmp + " " ;
		} 	
		if( tmp2 == 36 ) {		// *****  [$]
				hr += tmp + " " ;
		}
		if( tmp2 == 45 ) {		// *****  [-]
				hr += tmp + " " ;
		}
		if( tmp2 == 58 ) {		// *****  [:]
				hr += tmp + " " ;
		}
		if( tmp2 == 47 ) {		// *****  [/]
				hr += tmp + " " ;
		}
		if( tmp2 == 46 ) {		// *****  [.]
				hr += tmp + " " ;
		}
		if( tmp2 == 43 ) { 		// *****  [+]
				hr += tmp + " " ;
		}

		if(( tmp2 == 65 ) || ( tmp2 == 84 )) {	// *****  A ou T
				hr += tmp + " " ;
		}

		if(( tmp2 == 66 ) || ( tmp2 == 78 )) {	// *****  B ou N
				hr += tmp + " " ;
		}
		if(( tmp2 == 67 ) || ( tmp2 == 42 )) {	// *****  C ou [*]
				hr += tmp + " " ;
		}
		if(( tmp2 == 68 ) || ( tmp2 == 69 )) {	// *****  D ou E
				hr += tmp + " " ;
		}
		
}
Si vous avez un lien vers un bon tutoriel concernant les expressions régulières, je suis preneur.

Merci d'avance pour votre aide.

. :wink:

Posté : 27 août 2005, 18:51
par Cyrano
À mon avis, tu vas trouver ton bonheur ICI

Posté : 27 août 2005, 19:14
par JazzFinder
Ou encore, ici: http://www.expreg.com

Posté : 27 août 2005, 22:52
par Cyrano
Ou encore, ici: http://www.expreg.com
À ce détail près que là, on est en Javascript ;)

Posté : 28 août 2005, 11:16
par PhilFree
Merci à vous deux !

J'ai lu les tutos, mais ce n'est vraiment pas clair.

Je crois que je préfère les "if", au moins ça fonctionne et c'est clair.

Ces expressions régulières sont vraiment mal documentées et les tutoriels sont confus.

Donc longue vie aux IF et autres switch :wink:

Posté : 28 août 2005, 11:46
par Ripat
Ces expressions régulières sont vraiment mal documentées et les tutoriels sont confus.
Mal documenté? :shock:

Je pense qu'il y a peu d'outils qui soient utilisés dans autant de langages (Perl, PHP, ASP, MySQL, JS, Python, .Net, Java etc....)

Il y a même des possibilités d'utilisation de regex dans Word et Excel (mal implémentées mais bon...)

Même si il y a de légères différences d'implémentations, un motif de regex reste un motif de regex.

Je pense donc, au contraire, qu'il y a très peu d'outils aussi bien documenté. Il faut s'y mettre, c'est tout.

Pour ton cas, que préfères-tu: tes if successifs ou ceci (si j'ai bien compris ton problème):
$txt = preg_replace('#[0-9\$:/\.\+ATBNCDE*-]#', null, $txt);

Posté : 28 août 2005, 11:55
par naholyr
Le problème est double pour toi :
- d'une part tu veux faire un remplacement, en ceci tu peux remplacer ta série de IF par une seule expression régulière en JavaScript

Code : Tout sélectionner

valeur = valeur.replace(/[\d\$\-:\.\+\*ATBNCDE]/g, "")
(note: si tu oublies le "g" à la fin, JavaScript ne remplacera que la première occurrence trouvée, je dis ça de mémoire si ça ne fonctionne pas retire-le et vérifie le résultat)
- d'une autre part tu remplis un tableau bc. Une regexp ne pourra pas le faire pour toi en JavaScript (l'option /e n'y existe pas à ma connaissance), donc si ce tableau doit impérativement être rempli, tu devras de toute façon passer par cette boucle.

Posté : 28 août 2005, 17:12
par PhilFree
Mal documenté? :shock:
...
$txt = preg_replace('#[0-9\$:/\.\+ATBNCDE*-]#', null, $txt);
...

Code : Tout sélectionner

valeur = valeur.replace(/[\d\$\-:\.\+\*ATBNCDE]/g, "")
Merci beaucoup à vous deux pour vos réponses,

Mais, voici exactement ce que je veux dire par MAL DOCUMENTE.

Un même problème et deux solutions qui ne donnent AUCUN résultat.

Je soupçonne que Ripat l'ait écrit en PHP, mais ça ne change rien au problème.

Il faut que je chasse de toutes mes chaînes les caractères qui ne sont:
- ni 0 à 9
- ni A,B,C,D,E,T,N
- ni $,-,:,/,.,+

:?:

Posté : 28 août 2005, 23:13
par naholyr
Un même problème et deux solutions qui ne donnent AUCUN résultat.
Les deux solutions sont les mêmes, il s'agit du même masque, de la même expression régulière.
Je soupçonne que Ripat l'ait écrit en PHP, mais ça ne change rien au problème.
En effet, puisque l'expression est la même dans les deux cas.
Il faut que je chasse de toutes mes chaînes les caractères qui ne sont:
- ni 0 à 9
- ni A,B,C,D,E,T,N
- ni $,-,:,/,.,+
Ce qui revient à remplacer tous les caractères 0 à 9, A, B, C, D, E, T, N, $, -, :, /, . et + par rien, soit (je réitère) en javascript valeur = valeur.replace(/[0-9ABCDETN\$\-:\/\.\+]/g, "");.

On peut difficilement faire plus simple :)

Posté : 29 août 2005, 09:49
par PhilFree
Ce qui revient à remplacer tous les caractères 0 à 9, A, B, C, D, E, T, N, $, -, :, /, . et + par rien, soit (je réitère) en javascript valeur = valeur.replace(/[0-9ABCDETN\$\-:\/\.\+]/g, "");.

On peut difficilement faire plus simple :)
On ne peut pas faire plus simple, le HIC c'est que ça ne marche pas. :lol:

Avec:
[0-9ABCDETN\$\-:\/\.\+] il enlève de la chaîne tous les caractères autorisés et laisse les caractères interdits.

Donc j'essaye avec:
[^0-9ABCDETN\$\-:\/\.\+] et là j'ai une erreur Javascript: "unterminated character class"
(le ^ je l'ai pourtant trouvé ici http://aidejavascript.com/article65.html )

Quand je vous dit que ces Expression régulières sont MAL DOCUMENTEES

:!: :!: :!:

Posté : 29 août 2005, 10:21
par naholyr
Sans doute faut-il échapper le ":". Sinon tu peux aussi faire un remplacement de chaine brute, ce sera de toute façon plus efficace...

Posté : 29 août 2005, 14:38
par PhilFree
Sans doute faut-il échapper le ":". Sinon tu peux aussi faire un remplacement de chaine brute, ce sera de toute façon plus efficace...
Bon, ben ça me rassure, avec ces expressions régulières, je vois que vous pédalez dans la semoule tout comme moi. :wink:

Je reste donc aux IF :!:

Posté : 29 août 2005, 18:48
par PhilFree
J'ai enfin trouvé la solution grâce à votre aide !

On peut donc remplacer ça:

Code : Tout sélectionner

// test de la validité des caractères - élimination des caractères interdits // caractères autorisés: 0-9 A-E TN $-:/*.+ (24 caractères aut.) for ( i = 0 ; i < dtalgth ; i++ ) { tmp = valeur.substr( i, 1 ) ; tmp2 = tmp.charCodeAt( 0 ) ; if((tmp2 >= 48) && (tmp2 <= 57)) { // ***** [0]..[9] hr += tmp + " " ; } if( tmp2 == 36 ) { // ***** [$] hr += tmp + " " ; } if( tmp2 == 45 ) { // ***** [-] hr += tmp + " " ; } if( tmp2 == 58 ) { // ***** [:] hr += tmp + " " ; } if( tmp2 == 47 ) { // ***** [/] hr += tmp + " " ; } if( tmp2 == 46 ) { // ***** [.] hr += tmp + " " ; } if( tmp2 == 43 ) { // ***** [+] hr += tmp + " " ; } if(( tmp2 == 65 ) || ( tmp2 == 84 )) { // ***** A ou T hr += tmp + " " ; } if(( tmp2 == 66 ) || ( tmp2 == 78 )) { // ***** B ou N hr += tmp + " " ; } if(( tmp2 == 67 ) || ( tmp2 == 42 )) { // ***** C ou [*] hr += tmp + " " ; } if(( tmp2 == 68 ) || ( tmp2 == 69 )) { // ***** D ou E hr += tmp + " " ; } }
Par ça:

Code : Tout sélectionner

// test de la validité des caractères - élimination des caractères interdits // caractères autorisés: 0-9 A-E TN $-:/*.+ (24 caractères aut.) hr = valeur.replace(/[^0-9ABCETN\$\-:\*\/\.\+]/g, "");
Quelle galère ces expressions régulières, mais ça permet d'économiser pas mal de lignes de code.
:evil:

Posté : 29 août 2005, 19:41
par Ripat
Bon, ben ça me rassure, avec ces expressions régulières, je vois que vous pédalez dans la semoule tout comme moi.
Hum ...

Naholyr, retiens-toi! Pas sur la tête !

PS: Naholyr et moi sommes les auteurs de deux tuto sur les regex. On ne pédale plus dans la semoule. Juste un peu dans la choucroute de temps en temps. Il y a un mieux. :wink:

Posté : 29 août 2005, 22:34
par naholyr

Code : Tout sélectionner

// test de la validité des caractères - élimination des caractères interdits // caractères autorisés: 0-9 A-E TN $-:/*.+ (24 caractères aut.) hr = valeur.replace(/[^0-9ABCETN\$\-:\*\/\.\+]/g, "");
Je n'avais pas compris ton algo avec les IF, pour moi c'était des caractères interdits, et tu voulais les supprimer. En effet il suffisait d'ajouter le ^ au début de la classe ;)

Tu verras, les expressions régulières (surtout en php avec preg_replace_callback et preg_grep par exemple) te permettront d'alléger tous tes traitements de chaines, et en prime de les rendre plus performants ;)
Je comprends que ça soit un peu obscur au départ, mais il faut t'accrocher ça vaut le coup. Allez viens jeune padawan, nous pouvons t'enseigner le secret de la Force Rationnelle :idea: