Sí, es [[:digit:]]
~ [0-9]
~ \d
(donde ~ significa aproximado).
En la mayoría de los lenguajes de programación (donde es compatible) \d
≡ [[:digit:]]
(idéntico).
El \d
es menos común que [[:digit:]]
(no en POSIX pero está en GNU grep -P
).
Hay muchos dígitos en UNICODE , por ejemplo:
123456789 # Hindu-Arabic
Números arábigos
٠١٢٣٤٥٦٧٨٩ # ARABIC-INDIC
۰۱۲۳۴۵۶۷۸۹ # EXTENDED ARABIC-INDIC/PERSIAN
߀߁߂߃߄߅߆߇߈߉ # NKO DIGIT
०१२३४५६७८९ # DEVANAGARI
Todo lo cual puede estar incluido en [[:digit:]]
o \d
.
En cambio, [0-9]
generalmente son solo los dígitos ASCII 0123456789
.
Hay muchos lenguajes: Perl, Java, Python, C. En los cuales [[:digit:]]
(y \d
) requiere un significado extendido. Por ejemplo, este código perl coincidirá con todos los dígitos de arriba:
$ a='0123456789 ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ ߀߁߂߃߄߅߆߇߈߉ ०१२३४५६७८९'
$ echo "$a" | perl -C -pe 's/[^\d]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Lo que equivale a seleccionar todos los caracteres que tienen las propiedades Unicode de Numeric
y digits
:
$ echo "$a" | perl -C -pe 's/[^\p{Nd}]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Qué grep podría reproducirse (la versión específica de pcre puede tener una lista interna diferente de puntos de código numérico que Perl):
$ echo "$a" | grep -oP '\p{Nd}+'
0123456789
٠١٢٣٤٥٦٧٨٩
۰۱۲۳۴۵۶۷۸۹
߀߁߂߃߄߅߆߇߈߉
०१२३४५६७८९
Cámbielo a [0-9] para ver:
$ echo "$a" | grep -o '[0-9]\+'
0123456789
POSIX
Para el POSIX BRE o ERE específico:
El \d
no es compatible (no en POSIX pero está en GNU grep -P
).
[[:digit:]]
POSIX requiere que se corresponda con la clase de caracteres de dígitos, que a su vez ISO C requiere que sean los caracteres del 0 al 9 y nada más. Así que sólo en C locale todo [0-9]
, [0123456789]
, \d
y [[:digit:]]
significan exactamente lo mismo. No [0123456789]
tiene posibles interpretaciones erróneas, [[:digit:]]
está disponible en más utilidades y es común que solo signifique [0123456789]
. El \d
es compatible con pocas utilidades.
En cuanto a [0-9]
, el significado de las expresiones de rango solo está definido por POSIX en la configuración regional C; en otros entornos locales puede ser diferente (puede ser el orden de los puntos de código o el orden de clasificación u otra cosa).
conchas
Algunas implementaciones pueden entender que un rango es algo diferente del orden ASCII simple (por ejemplo, ksh93):
$ LC_ALL=en_US.utf8 ksh -c 'a="'"$a"'";echo "${a//[0-9]}"'
۹ ߀߁߂߃߄߅߆߇߈߉ ९
Y esa es una fuente segura de errores que esperan suceder.