Sim, é [[:digit:]]
~ [0-9]
~ \d
(onde ~ significa aproximado).
Na maioria das linguagens de programação (onde é suportado) \d
≡ [[:digit:]]
(idêntico).
O \d
é menos comum que [[:digit:]]
(não no POSIX, mas no GNU grep -P
).
Existem muitos dígitos no UNICODE , por exemplo:
123456789 # Hindu-Arabic
algarismos arábicos
٠١٢٣٤٥٦٧٨٩ # ARABIC-INDIC
۰۱۲۳۴۵۶۷۸۹ # EXTENDED ARABIC-INDIC/PERSIAN
߀߁߂߃߄߅߆߇߈߉ # NKO DIGIT
०१२३४५६७८९ # DEVANAGARI
Tudo isso pode ser incluído em [[:digit:]]
ou \d
.
Em vez disso, [0-9]
geralmente são apenas os dígitos ASCII 0123456789
.
Existem muitas linguagens: Perl, Java, Python, C. Na qual [[:digit:]]
(e \d
) exige um significado estendido. Por exemplo, esse código perl corresponderá a todos os dígitos acima:
$ a='0123456789 ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ ߀߁߂߃߄߅߆߇߈߉ ०१२३४५६७८९'
$ echo "$a" | perl -C -pe 's/[^\d]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
O que equivale a selecionar todos os caracteres que possuem as propriedades Unicode Numeric
e digits
:
$ echo "$a" | perl -C -pe 's/[^\p{Nd}]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Qual grep poderia reproduzir (a versão específica do pcre pode ter uma lista interna diferente de pontos de código numérico que o Perl):
$ echo "$a" | grep -oP '\p{Nd}+'
0123456789
٠١٢٣٤٥٦٧٨٩
۰۱۲۳۴۵۶۷۸۹
߀߁߂߃߄߅߆߇߈߉
०१२३४५६७८९
Altere para [0-9] para ver:
$ echo "$a" | grep -o '[0-9]\+'
0123456789
POSIX
Para o POSIX BRE ou ERE específico:
O \d
não é suportado (não no POSIX, mas no GNU grep -P
).
[[:digit:]]
é exigido pelo POSIX para corresponder à classe de caracteres de dígito, que por sua vez é exigida pela ISO C como sendo os caracteres de 0 a 9 e nada mais. Assim, apenas em C locale tudo [0-9]
, [0123456789]
, \d
e [[:digit:]]
significam exatamente a mesma. O [0123456789]
não possui possíveis interpretações errôneas, [[:digit:]]
está disponível em mais utilitários e é comum apenas significar [0123456789]
. O \d
é suportado por alguns utilitários.
Quanto a [0-9]
, o significado das expressões de intervalo é definido apenas pelo POSIX no código de idioma C; em outros locais, pode ser diferente (pode ser uma ordem de ponto de código ou ordem de intercalação ou outra coisa).
cartuchos
Algumas implementações podem entender um intervalo como algo diferente da ordem ASCII simples (ksh93 por exemplo):
$ LC_ALL=en_US.utf8 ksh -c 'a="'"$a"'";echo "${a//[0-9]}"'
۹ ߀߁߂߃߄߅߆߇߈߉ ९
E essa é uma fonte segura de bugs esperando para acontecer.