Sim, é [[:digit:]]
~ [0-9]
~ \d
(onde ~ significa aproximada).
Na maioria das linguagens de programação (onde é suportado) \d
≡ [[:digit:]]
(identico).
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
Todos os podem ser incluídos em [[:digit:]]
ou \d
.
Em vez disso, [0-9]
geralmente é apenas os dígitos ASCII 0123456789
.
Existem muitos idiomas: Perl, Java, Python, C. Em que [[: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٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Qual é o equivalente a selecionar todos os caracteres com as propriedades Unicode de Numeric
e digits
:
$ echo "$a" | perl -C -pe 's/[^\p{Nd}]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Que grep poderia reproduzir (a versão específica do pcre pode ter uma lista interna diferente de pontos de código numérico que 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 caractere de dígitos, que por sua vez é requerida pela ISO C para os caracteres de 0 a 9 e nada mais. Portanto, somente na localidade C , todos os [0-9]
, [0123456789]
, \d
e [[:digit:]]
significam exatamente o mesmo. O [0123456789]
não tem interpretações erradas possíveis, [[:digit:]]
está disponível em mais utilitários e é comum significar apenas [0123456789]
. O \d
é suportado por alguns utilitários.
Quanto a [0-9]
, o significado de expressões de intervalo é definido apenas por POSIX na localidade C; em outras localidades, pode ser diferente (pode ser uma ordem codepoint ou ordem de intercalação ou outra coisa).
shells
Algumas implementações podem entender que um intervalo é algo diferente da ordem simples ASCII (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.