#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 ?
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 ?
entre [[, les extglob fonctionnent sans avoir à activer l'option avec shopt
Très juste
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
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