Expression régulière capricieuse

Expression régulière capricieuse - Shell/Batch - Programmation

Marsh Posté le 25-01-2011 à 17:38:48    

Bonjour,
 
J'ai un soucis avec cette expression régulière :  
 
[A-Za-z0-9_-]*
 
Placée dans un test elle devrait autoriser l'écriture d'un seul mot, mais elle autorise visiblement les espaces et ainsi d'écrire toute une phrase...
 
Comment pourrais-je exclure l'espace de la expression ?

Reply

Marsh Posté le 25-01-2011 à 17:38:48   

Reply

Marsh Posté le 25-01-2011 à 19:00:25    

Bonjour,
 
De mémoire :
\< : début d'un mot
\> : fin d'un mot.
 
Donc :  
\<[A-Za-z0-9_-]*\>
 
(A tester)


---------------
:o
Reply

Marsh Posté le 25-01-2011 à 19:09:16    

Citation :

mais elle autorise visiblement les espaces et ainsi d'écrire toute une phrase


Non, [A-Za-z0-9_-]* n'autorise pas les espaces, le pb est donc ailleurs.
On pourrait voir le code ou cette regexp est utilisée?
A+,


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

Marsh Posté le 27-01-2011 à 16:21:10    

Code :
  1. read line
  2. if [[ $line == [A-Za-z0-9_-]* ]];
  3. then echo "ça marche"
  4. else echo "ça marche pas"
  5. fi


 
si j'écris  

Code :
  1. blablabla


il me renvoi "ça marche"
 
et si j'écris

Code :
  1. bla bla bla bla bla


il me renvoi "ça marche" aussi...
 
et en testant \<[A-Za-z0-9_-]*\>  
il me renvoi à tous les coups "ça marche pas"...
 

Reply

Marsh Posté le 27-01-2011 à 16:46:26    

Et avec
if [[ "$line" == [A-Za-z0-9_-]* ]];
ça donne quoi?
A+,


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

Marsh Posté le 27-01-2011 à 18:00:56    

Pareil...

Reply

Marsh Posté le 27-01-2011 à 18:33:44    

C'est peut être un effet de * dans un contexte [[  ]]
Ca donne quoi avec if [ "$line" == [A-Za-z0-9_-]* ];  
A+,


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

Marsh Posté le 28-01-2011 à 02:28:30    

il me met un  

Code :
  1. [: too many arguments

Reply

Marsh Posté le 28-01-2011 à 09:59:55    

Euh, c'est quel shell que tu utilises? bash ?
A+,


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

Marsh Posté le 28-01-2011 à 17:04:27    

oui c'est du bash

Reply

Marsh Posté le 28-01-2011 à 17:04:27   

Reply

Marsh Posté le 28-01-2011 à 18:09:09    

Bon, j'ai testé un peu, je sais pas trop ce que fait == dans un [[ ]] mais c'est bizarre.
 
Après qques essais, j'ai trouvé un truc qui marche:
 

Code :
  1. #!/bin/bash
  2. read line
  3.  
  4. if [[ $line =~ ^[A-Za-z0-9_-]*$ ]];
  5. then echo "ca marche"
  6. else echo "ca marche pas"
  7. fi


 
A+,


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

Marsh Posté le 30-01-2011 à 00:56:23    

Et bien je demande où tu as été chercher cette solution mais elle marche au poil !
 
Je te remercie vraiment de t'être autant décarcasser pour mon problème gilou ! merci beaucoup !

Reply

Marsh Posté le 01-02-2011 à 12:03:26    

En fait l'étoile signifie 0 a n occurrence de ce qu'il y a entre [ ].
Du coup c'est toujours vrai car même si ca apparait 0 fois l'expression est validée ;)

 

La solution apportée par Gilou corrige le problème car il dit qu'il doit avoir un début de ligne (^), ce qu'il y a entre crochet répété 0 à n fois et une fin de ligne ($).

 

Autrement dit, si un carctère n'étant pas entre crochet apparait, l'expression régulière sera invalidée et la ligne rejetée.

 

Par contre attention, les lignes vides devraient toujours sortir avec cette expression. Pour éviter ça, il faut remplacer l'étoile par un + qui signifie "au moins une fois la partie entre crochet"


Message édité par Nukolau le 01-02-2011 à 12:04:59
Reply

Marsh Posté le 01-02-2011 à 15:02:01    

Vu qu'il avait mis comme expression régulière initiale [A-Za-z0-9_-]* qui autorise les lignes vides, j'avais laissé l'étoile dans ma solution.
A+,


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

Sujets relatifs:

Leave a Replay

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