Tak, jest to [[:digit:]]
~ [0-9]
~ \d
(gdzie ~ oznacza przybliżone).
W większości języków programowania (tam, gdzie jest obsługiwany) \d
≡ [[:digit:]]
(identyczny). Jest mniej powszechne niż (nie w POSIX ale jest w GNU ).
\d
[[:digit:]]
grep -P
W UNICODE jest wiele cyfr , na przykład:
123456789 # Hindu-Arabic
cyfry arabskie
٠١٢٣٤٥٦٧٨٩ # ARABIC-INDIC
۰۱۲۳۴۵۶۷۸۹ # EXTENDED ARABIC-INDIC/PERSIAN
߀߁߂߃߄߅߆߇߈߉ # NKO DIGIT
०१२३४५६७८९ # DEVANAGARI
Z których wszystkie mogą być zawarte w [[:digit:]]
lub \d
.
Zamiast tego [0-9]
generalnie są to tylko cyfry ASCII 0123456789
.
Istnieje wiele języków: Perl, Java, Python, C. W których [[:digit:]]
(i \d
) wymaga rozszerzenia znaczenia. Na przykład ten kod perla będzie pasował do wszystkich cyfr z góry:
$ a='0123456789 ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ ߀߁߂߃߄߅߆߇߈߉ ०१२३४५६७८९'
$ echo "$a" | perl -C -pe 's/[^\d]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Co jest równoważne z zaznaczeniem wszystkich znaków, które mają właściwości Unicode Numeric
i digits
:
$ echo "$a" | perl -C -pe 's/[^\p{Nd}]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Który grep mógłby się reprodukować (konkretna wersja pcre może mieć inną wewnętrzną listę punktów kodu niż Perl):
$ echo "$a" | grep -oP '\p{Nd}+'
0123456789
٠١٢٣٤٥٦٧٨٩
۰۱۲۳۴۵۶۷۸۹
߀߁߂߃߄߅߆߇߈߉
०१२३४५६७८९
Zmień na [0-9], aby zobaczyć:
$ echo "$a" | grep -o '[0-9]\+'
0123456789
POSIX
Dla konkretnego POSIX BRE lub ERE:
Nie \d
jest obsługiwany (nie w POSIX, ale w GNU grep -P
).
[[:digit:]]
jest wymagany przez POSIX, aby odpowiadał cyfrowej klasie znaków, która z kolei jest wymagana przez ISO C jako znaki od 0 do 9 i nic więcej. Tak tylko w C locale wszystko [0-9]
, [0123456789]
, \d
i [[:digit:]]
znaczy dokładnie to samo. Nie [0123456789]
ma żadnych możliwych błędnych interpretacji, [[:digit:]]
jest dostępny w większej liczbie programów narzędziowych i zwykle oznacza tylko [0123456789]
. \d
Jest obsługiwana przez kilku narzędzi.
Jeśli chodzi o [0-9]
znaczenie wyrażeń zakresowych, POSIX definiuje je tylko w ustawieniach regionalnych C. w innych lokalizacjach może być inaczej (może to być kolejność kodów lub kolejność sortowania lub coś innego).
muszle
Niektóre implementacje mogą rozumieć zakres jako coś innego niż zwykły porządek ASCII (na przykład ksh93):
$ LC_ALL=en_US.utf8 ksh -c 'a="'"$a"'";echo "${a//[0-9]}"'
۹ ߀߁߂߃߄߅߆߇߈߉ ९
I to jest pewne źródło błędów, które czekają na wystąpienie.