Oui, c’est [[:digit:]]
~ [0-9]
~ \d
(où ~ signifie approximativement).
Dans la plupart des langages de programmation (où il est supporté) \d
≡ [[:digit:]]
(identique).
Le \d
est moins courant que [[:digit:]]
(pas dans POSIX mais dans GNU grep -P
).
Il y a beaucoup de chiffres dans UNICODE , par exemple:
123456789 # Hindu-Arabic
chiffres arabes
٠١٢٣٤٥٦٧٨٩ # ARABIC-INDIC
۰۱۲۳۴۵۶۷۸۹ # EXTENDED ARABIC-INDIC/PERSIAN
߀߁߂߃߄߅߆߇߈߉ # NKO DIGIT
०१२३४५६७८९ # DEVANAGARI
Tous pouvant être inclus dans [[:digit:]]
ou \d
.
Au lieu de cela, [0-9]
est généralement que les chiffres ASCII 0123456789
.
Il existe de nombreux langages: Perl, Java, Python, C. Dans lequel [[:digit:]]
(et \d
) appelle un sens étendu. Par exemple, ce code Perl correspondra à tous les chiffres ci-dessus:
$ a='0123456789 ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ ߀߁߂߃߄߅߆߇߈߉ ०१२३४५६७८९'
$ echo "$a" | perl -C -pe 's/[^\d]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Ce qui revient à sélectionner tous les caractères ayant les propriétés Unicode de Numeric
et digits
:
$ echo "$a" | perl -C -pe 's/[^\p{Nd}]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Ce que grep pourrait reproduire (la version spécifique de pcre peut avoir une liste de points de code numérique différente de celle de Perl):
$ echo "$a" | grep -oP '\p{Nd}+'
0123456789
٠١٢٣٤٥٦٧٨٩
۰۱۲۳۴۵۶۷۸۹
߀߁߂߃߄߅߆߇߈߉
०१२३४५६७८९
Changez-le en [0-9] pour voir:
$ echo "$a" | grep -o '[0-9]\+'
0123456789
POSIX
Pour les BRE POSIX ou ERE spécifiques:
Le \d
n'est pas pris en charge (pas dans POSIX, mais dans GNU grep -P
).
[[:digit:]]
POSIX exige que le code corresponde à la classe de caractères numériques, qui, à son tour, est requis par ISO C pour être les caractères de 0 à 9 et rien d’autre. Alors que dans C la locale tout [0-9]
, [0123456789]
, \d
et cela [[:digit:]]
signifie exactement la même chose. Le [0123456789]
a pas de mauvaise interprétation possible, [[:digit:]]
est disponible dans plusieurs utilitaires et il est commun de ne signifier que [0123456789]
. Le \d
est pris en charge par quelques utilitaires.
Quant à [0-9]
la signification des expressions de plage, elle n’est définie que par POSIX dans les paramètres régionaux C; dans d'autres pays, il peut être différent (par exemple, un ordre de codage, un ordre de classement ou autre chose).
coquilles
Certaines implémentations peuvent comprendre qu'une plage est quelque chose de différent de l'ordre ASCII ordinaire (ksh93 par exemple):
$ LC_ALL=en_US.utf8 ksh -c 'a="'"$a"'";echo "${a//[0-9]}"'
۹ ߀߁߂߃߄߅߆߇߈߉ ९
Et c’est une source sûre de bugs en attente de réalisation.