Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 31/10/2021, à 14:55

Tawal

[Résolu] [bash] Regex avec répétition de caractères ?

Hello,

Je ne suis pas un expert en regex.
Mais pourquoi la 1ère formule ne fonctionne pas ?

$ a="1234"
$ if [[ $a == [0-9]{4} ]]; then echo OK; fi
$ 
$ if [[ $a == [0-9][0-9][0-9][0-9] ]]; then echo OK; fi
OK
$

J'ai essayé en protégeant les accolades, c'est pareil.

Dernière modification par Tawal (Le 01/11/2021, à 08:54)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#2 Le 31/10/2021, à 15:29

kamaris

Re : [Résolu] [bash] Regex avec répétition de caractères ?

Parce que c'est pas le bon opérateur :

$ if [[ $a =~ [0-9]{4} ]]; then echo OK; fi
OK
$

Hors ligne

#3 Le 31/10/2021, à 15:29

soshy

Re : [Résolu] [bash] Regex avec répétition de caractères ?

Salut,
Alors pour comparer à une regex, il faut utiliser =~
Et là, ton truc fonctionne :

$ a="1234"
$ if [[ $a =~ [0-9]{4} ]]; then echo OK; fi
OK
$

Mais je suis pas trop capable de te dire pourquoi ton truc en multipliant les [0-9] fonctionne en revanche ^^

Hors ligne

#4 Le 31/10/2021, à 15:37

kamaris

Re : [Résolu] [bash] Regex avec répétition de caractères ?

Parce que ça suit les règles de la correspondance de motifs (cf. man bash, pattern matching).
On peut aussi faire

if [[ $a == +([0-9]) ]]; then echo OK; fi

Dans un script il faut activer extglob pour ça.

Hors ligne

#5 Le 31/10/2021, à 15:50

Watael

Re : [Résolu] [bash] Regex avec répétition de caractères ?

attention.
123456789 correspondra aussi avec [0-9]{4}, car le nombre contient quatre chiffres (au moins).


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 31/10/2021, à 16:09

pingouinux

Re : [Résolu] [bash] Regex avec répétition de caractères ?

Bonjour,
Pour te limiter à 4 chiffres décimaux :

$ a="1234"
$ echo "$a"; if [[ $a =~ ^[0-9]{4}$ ]]; then echo OK; else echo KO; fi
1234
OK

$ a="01234"
$ echo "$a"; if [[ $a =~ ^[0-9]{4}$ ]]; then echo OK; else echo KO; fi
01234
KO

$ a="12345"
yves@mimosa:/tmp/tst
$ echo "$a"; if [[ $a =~ ^[0-9]{4}$ ]]; then echo OK; else echo KO; fi
12345
KO

Hors ligne

#7 Le 31/10/2021, à 16:38

Watael

Re : [Résolu] [bash] Regex avec répétition de caractères ?

kamaris a écrit :

Dans un script il faut activer extglob pour ça.

entre [[, les extglob fonctionnent sans avoir à activer l'option avec shopt.

$ shopt extglob
extglob        off
$ [[ 123 == +([0-9]) ]]; echo $?
0
$

--
contrairement aux regex, ces extensions n'offrent pas de possibilité de quantifier le nombre de correspondances (autrement que (en gros) 0, 1, tout; cf. man bash pour plus de précision).


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 31/10/2021, à 16:53

kamaris

Re : [Résolu] [bash] Regex avec répétition de caractères ?

Watael a écrit :

entre [[, les extglob fonctionnent sans avoir à activer l'option avec shopt

Très juste smile

Hors ligne

#9 Le 01/11/2021, à 08:54

Tawal

Re : [Résolu] [bash] Regex avec répétition de caractères ?

Super !
Merci pour ces explications très claires et concises.

Donc comme je veux tester la correspondance avec exactement 4 chiffres (pas 3 ni 5), je retiens :

$ a="1234"
$ if [[ $a =~ ^[0-9]{4}$ ]]; then echo OK; fi
OK
$ 
$ a="12345"
$ if [[ $a =~ ^[0-9]{4}$ ]]; then echo OK; fi
$

Merci beaucoup smile


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#10 Le 01/11/2021, à 12:32

Watael

Re : [Résolu] [bash] Regex avec répétition de caractères ?

ou alors :

[[ ${#var} == 4 && $var == +([0-9]) ]]

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne