Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2608 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  comparaison avec une expression régulière

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

comparaison avec une expression régulière

n°1563545
benjiji
Posté le 22-05-2007 à 15:44:54  profilanswer
 

Voila j'aimerai comparer une chaine de caractère avec une expression régulière
 
Sur une machine Sun je peux faire comme ça :
 
expr_reg="bo*"
mot="bonjour"
if [[ $mot == $expr_reg ]] then
echo "yep"
else
echo "nop"
fi
 
voila là ça marche niquel
 
 
Mais sur une machine HP il faut que je change la conditon car ça ne marche pas
 
expr_reg="bo*"
mot="bonjour"
if ( expr bonjour : "\($expr_reg\)" ) then  --> voila cette ligne est fausse
echo "yep"
else
echo "nop"
fi
 
si quelqu'un pouvais me dire comment faire ça serai cool
merci

Message cité 1 fois
Message édité par benjiji le 22-05-2007 à 15:55:15
mood
Publicité
Posté le 22-05-2007 à 15:44:54  profilanswer
 

n°1563580
benjiji
Posté le 22-05-2007 à 16:19:22  profilanswer
 

bon je pense que le problème est que l'expression * n'est pas reconnu il faut donc remplacer * par \{0,\}
 
expr_reg="bo\{0,\}"
mot="bonjour"
if ( expr $mot : $expr_reg ) then
echo "yep"
else
echo "nop"
fi
 
voila là ça marche ...

n°1563725
matafan
Posté le 22-05-2007 à 20:35:44  profilanswer
 

Fais gaffe, je crois que tu confonds deux truc différents : l'opérateur ":" de "expr" qui marche avec des regexp, et le == qui prend (avec les shells qui le supportent) un pattern qui n'est pas une regexp ; c'est juste un pattern du même genre que pour l'expension des nom de fichiers.

n°1564817
qqcvd
Posté le 24-05-2007 à 18:44:15  profilanswer
 

benjiji a écrit :

Voila j'aimerai comparer une chaine de caractère avec une expression régulière
 
Sur une machine Sun je peux faire comme ça :
 
expr_reg="bo*"
mot="bonjour"
if [[ $mot == $expr_reg ]] then
echo "yep"
else
echo "nop"
fi
 
voila là ça marche niquel
 
 
Mais sur une machine HP il faut que je change la conditon car ça ne marche pas
 
expr_reg="bo*"
mot="bonjour"
if ( expr bonjour : "\($expr_reg\)" ) then  --> voila cette ligne est fausse
echo "yep"
else
echo "nop"
fi
 
si quelqu'un pouvais me dire comment faire ça serai cool
merci


 
 
ton premier test, est vraiment etrange, "==" n estp as fait pour tester des expressions reguliere pour moi. mais juste l egalite de string.
 
ensuite tu t es trompé dans ton expression reguliere, tu voulais peut etre ecrire
bo.*
car bo* correspond par exemple à boooooooo mais pas a bonjour
 

n°1564972
aigles
Posté le 25-05-2007 à 08:51:52  profilanswer
 

qqcvd a écrit :

ton premier test, est vraiment etrange, "==" n estp as fait pour tester des expressions reguliere pour moi. mais juste l egalite de string.
 
ensuite tu t es trompé dans ton expression reguliere, tu voulais peut etre ecrire
bo.*
car bo* correspond par exemple à boooooooo mais pas a bonjour


 
La forme '[[ ... ]]' différe quelque peu par rapport à '[ ... ]'
 

Citation :

[[ expression ]]  
Renvoie 1 ou 0 selon la valeur de la condition expression. les expressions sont composées d'éléments primaires décrits dans EXPRESSIONS CONDITIONNELLES. Le coupage des mots et l'expansion des chemins ne sont pas réalisés sur les portions entre [[ et ]]; l'expansion des tildes, des paramètres, des variable, des expressions arithmétiques, la substitution des commandes et des processus, ainsi que la disparition des apostrophes sont réalisés. Quand les opérateurs == et != sont utilisés, la chaîne placée à droite de l'opérateur est considérée comme étant un motif et est recherchée selon les règles décrites dans Motifs génériques. La valeur renvoyée est 0 si les chaînes correspondent (ou respectivement ne correspondent pas), et 1 sinon. Toute partie du motif peut être protégée avec des apostrophes pour forcer sa comparaison en tant que chaîne (sans développement). Les expressions peuvent être combinées en utilisant les opérateurs suivants, par ordre décroissant de priorité

:  
 
Les opérateurs == et = font la même chose (standard POSIX: =)
Attention, dans la forme [ … ], l’opérateur = est le test d’égalité entre deux chaînes  
 
 
Jean-Pierre.

n°1564978
matafan
Posté le 25-05-2007 à 09:10:54  profilanswer
 

Oui mais quoi qu'il en soit le == entre [[ ]] ne prend pas une regexp. Il prend un pattern du même type que pour les filename expansion (et là effectivement bo* veut dire "bo suivi de n'importe quoi). L'operateur ":" de expr, lui, prend par contre une regexp (et là il bo* veut dire "b suivit de 0 o ou d'un nombre quelconque de o" ).

n°1567561
chicotruss
Posté le 30-05-2007 à 23:20:57  profilanswer
 

tu peux essayer
 
echo $mot | grep $exp_reg >/dev/null 2>&1
if [ $? -eq 0 ]
then
  echo yep
else
  echo nop
fi
 
en protegant eventuellement $mot et $exp_reg par des guillemets s'il y a des risques qu'ils soient nulls


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  comparaison avec une expression régulière

 

Sujets relatifs
Expression régulière particulièreperl : expression rationnelle particuliere
[Perl - Débutant]Probleme de comparaison de 2 chainesComparaison de Chaine de caractères, déplacement DOM
Expression régulièresaugarde reguliere de la base
expression regulière pour controle mail 
Plus de sujets relatifs à : comparaison avec une expression régulière


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR