Да, это [[:digit:]]
~ [0-9]
~ \d
(где ~ означает приблизительно).
В большинстве языков программирования (где это поддерживается) \d
≡ [[:digit:]]
(идентично). Встречается реже , чем (не в POSIX , но это в GNU ).
\d
[[:digit:]]
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٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Какой grep может воспроизвести (конкретная версия pcre может иметь другой внутренний список числовых кодовых точек, чем Perl):
$ echo "$a" | grep -oP '\p{Nd}+'
0123456789
٠١٢٣٤٥٦٧٨٩
۰۱۲۳۴۵۶۷۸۹
߀߁߂߃߄߅߆߇߈߉
०१२३४५६७८९
Измените его на [0-9], чтобы увидеть:
$ echo "$a" | grep -o '[0-9]\+'
0123456789
POSIX
Для конкретного POSIX BRE или ERE: не поддерживается (не в POSIX , но в GNU ).
POSIX требуется для соответствия классу цифр, который, в свою очередь, требуется ISO C для символов от 0 до 9 и ничего больше. Так только в C локали все , , и означают одно и то же. Он не имеет возможных неправильных толкований, доступен в большем количестве утилит, и это обычно означает только . Поддерживается несколькими утилитами.
\d
grep -P
[[:digit:]]
[0-9]
[0123456789]
\d
[[:digit:]]
[0123456789]
[[:digit:]]
[0123456789]
\d
Что касается [0-9]
, значение выражений диапазона определяется только POSIX в локали C; в других локалях он может быть другим (может быть порядок кодовых точек или порядок сопоставления или что-то еще).
ракушки
Некоторые реализации могут понимать диапазон как нечто отличное от простого порядка ASCII (например, ksh93):
$ LC_ALL=en_US.utf8 ksh -c 'a="'"$a"'";echo "${a//[0-9]}"'
۹ ߀߁߂߃߄߅߆߇߈߉ ९
И это верный источник ошибок, ожидающих своего появления.