Так, це [[:digit:]]
~ [0-9]
~ \d
(де ~ означає приблизно).
У більшості мов програмування (де він підтримується) \d
≡ [[:digit:]]
(однаковий).
Це \d
рідше, ніж [[:digit:]]
(не в POSIX, але воно є в GNU grep -P
).
У UNICODE є багато цифр , наприклад:
123456789 # Hindu-Arabic
Арабські цифри
٠١٢٣٤٥٦٧٨٩ # ARABIC-INDIC
۰۱۲۳۴۵۶۷۸۹ # EXTENDED ARABIC-INDIC/PERSIAN
߀߁߂߃߄߅߆߇߈߉ # NKO DIGIT
०१२३४५६७८९ # DEVANAGARI
Все це може бути включено до [[:digit:]]
або \d
.
Натомість, [0-9]
це лише цифри ASCII 0123456789
.
Є багато мов: Perl, Java, Python, C. У яких [[:digit:]]
(і \d
) вимагається розширене значення. Наприклад, цей код perl буде відповідати всім цифрам зверху:
$ a='0123456789 ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ ߀߁߂߃߄߅߆߇߈߉ ०१२३४५६७८९'
$ echo "$a" | perl -C -pe 's/[^\d]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Що еквівалентно вибору всіх символів, які мають властивості Unicode Numeric
та digits
:
$ echo "$a" | perl -C -pe 's/[^\p{Nd}]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Який греп може відтворити (конкретна версія pcre може мати різний внутрішній список числових точок коду, ніж Perl):
$ echo "$a" | grep -oP '\p{Nd}+'
0123456789
٠١٢٣٤٥٦٧٨٩
۰۱۲۳۴۵۶۷۸۹
߀߁߂߃߄߅߆߇߈߉
०१२३४५६७८९
Змініть його на [0-9], щоб побачити:
$ echo "$a" | grep -o '[0-9]\+'
0123456789
POSIX
Для конкретного POSIX BRE або ERE:
The \d
не підтримується (не в POSIX, але знаходиться в GNU grep -P
).
[[:digit:]]
вимагає POSIX, щоб відповідати розрядному класу символів, який, в свою чергу, вимагається ISO C, щоб бути символами від 0 до 9 і більше нічого. Так тільки в C локалі все [0-9]
, [0123456789]
, \d
і [[:digit:]]
означають одне і те ж. [0123456789]
Не має можливих пересудів, [[:digit:]]
доступний в декількох утиліт , і це часто означає тільки [0123456789]
. The \d
підтримується декількома утилітами.
Що стосується [0-9]
, значення виразів діапазону визначається лише POSIX у мові C; в інших місцевостях це може бути інакше (це може бути порядок кодової точки чи порядок порівняння чи щось інше).
снарядів
Деякі реалізації можуть розуміти, що діапазон є чимось іншим, ніж звичайний порядок ASCII (наприклад, ksh93):
$ LC_ALL=en_US.utf8 ksh -c 'a="'"$a"'";echo "${a//[0-9]}"'
۹ ߀߁߂߃߄߅߆߇߈߉ ९
І це впевнене джерело помилок, які чекають цього.