Ya, itu [[:digit:]]
~ [0-9]
~ \d
(di mana ~ berarti aproksimat).
Dalam sebagian besar bahasa pemrograman (jika didukung) \d
≡ [[:digit:]]
(identik).
Ini \d
kurang umum daripada [[:digit:]]
(tidak dalam POSIX tetapi dalam GNU grep -P
).
Ada banyak digit di UNICODE , misalnya:
123456789 # Hindu-Arabic
Angka arab
٠١٢٣٤٥٦٧٨٩ # ARABIC-INDIC
۰۱۲۳۴۵۶۷۸۹ # EXTENDED ARABIC-INDIC/PERSIAN
߀߁߂߃߄߅߆߇߈߉ # NKO DIGIT
०१२३४५६७८९ # DEVANAGARI
Semuanya dapat dimasukkan dalam [[:digit:]]
atau \d
.
Sebaliknya, [0-9]
umumnya hanya angka ASCII 0123456789
.
Ada banyak bahasa: Perl, Java, Python, C. Di mana [[:digit:]]
(dan \d
) panggilan untuk makna yang diperluas. Misalnya, kode perl ini akan cocok dengan semua digit dari atas:
$ a='0123456789 ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ ߀߁߂߃߄߅߆߇߈߉ ०१२३४५६७८९'
$ echo "$a" | perl -C -pe 's/[^\d]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Yang setara dengan memilih semua karakter yang memiliki properti Unicode Numeric
dan digits
:
$ echo "$a" | perl -C -pe 's/[^\p{Nd}]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Grep mana yang dapat mereproduksi (versi spesifik pcre mungkin memiliki daftar internal yang berbeda dari poin kode numerik dari Perl):
$ echo "$a" | grep -oP '\p{Nd}+'
0123456789
٠١٢٣٤٥٦٧٨٩
۰۱۲۳۴۵۶۷۸۹
߀߁߂߃߄߅߆߇߈߉
०१२३४५६७८९
Ubah ke [0-9] untuk melihat:
$ echo "$a" | grep -o '[0-9]\+'
0123456789
POSIX
Untuk POSIX BRE atau ERE tertentu:
Tidak \d
didukung (tidak dalam POSIX tetapi dalam GNU grep -P
).
[[:digit:]]
diperlukan oleh POSIX agar sesuai dengan kelas karakter digit, yang pada gilirannya diwajibkan oleh ISO C untuk menjadi karakter 0 hingga 9 dan tidak ada yang lain. Jadi hanya dalam C locale semua [0-9]
, [0123456789]
, \d
dan [[:digit:]]
berarti persis sama. Tidak [0123456789]
ada kemungkinan salah tafsir, [[:digit:]]
tersedia dalam lebih banyak utilitas dan itu umum untuk berarti saja [0123456789]
. Ini \d
didukung oleh beberapa utilitas.
Adapun [0-9]
, arti dari range range hanya didefinisikan oleh POSIX di C locale; di lokal lain mungkin berbeda (mungkin urutan codepoint atau urutan pemeriksaan atau sesuatu yang lain).
kerang
Beberapa implementasi mungkin memahami rentang untuk menjadi sesuatu yang berbeda dari pesanan ASCII biasa (ksh93 misalnya):
$ LC_ALL=en_US.utf8 ksh -c 'a="'"$a"'";echo "${a//[0-9]}"'
۹ ߀߁߂߃߄߅߆߇߈߉ ९
Dan itu adalah sumber bug yang menunggu untuk terjadi.