Ja, es ist [[:digit:]]
~ [0-9]
~ \d
(wobei ~ ungefähr bedeutet).
In den meisten Programmiersprachen ( \d
sofern unterstützt) ≡ [[:digit:]]
(identisch).
Das \d
ist weniger verbreitet als [[:digit:]]
(nicht in POSIX, aber es ist in GNU grep -P
).
In UNICODE gibt es viele Ziffern , zum Beispiel:
123456789 # Hindu-Arabic
arabische Ziffern
٠١٢٣٤٥٦٧٨٩ # ARABIC-INDIC
۰۱۲۳۴۵۶۷۸۹ # EXTENDED ARABIC-INDIC/PERSIAN
߀߁߂߃߄߅߆߇߈߉ # NKO DIGIT
०१२३४५६७८९ # DEVANAGARI
All dies kann in [[:digit:]]
oder enthalten sein \d
.
Stattdessen stehen [0-9]
in der Regel nur die ASCII-Ziffern 0123456789
.
Es gibt viele Sprachen: Perl, Java, Python, C. In denen [[:digit:]]
(und \d
) nach einer erweiterten Bedeutung verlangt. Dieser Perl-Code stimmt beispielsweise mit allen Ziffern von oben überein:
$ a='0123456789 ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ ߀߁߂߃߄߅߆߇߈߉ ०१२३४५६७८९'
$ echo "$a" | perl -C -pe 's/[^\d]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Dies entspricht der Auswahl aller Zeichen mit den Unicode-Eigenschaften von Numeric
und digits
:
$ echo "$a" | perl -C -pe 's/[^\p{Nd}]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Welches grep reproduzieren könnte (die spezifische Version von pcre hat möglicherweise eine andere interne Liste numerischer Codepunkte als Perl):
$ echo "$a" | grep -oP '\p{Nd}+'
0123456789
٠١٢٣٤٥٦٧٨٩
۰۱۲۳۴۵۶۷۸۹
߀߁߂߃߄߅߆߇߈߉
०१२३४५६७८९
Ändern Sie es auf [0-9], um Folgendes anzuzeigen:
$ echo "$a" | grep -o '[0-9]\+'
0123456789
POSIX
Für das spezifische POSIX BRE oder ERE:
Das \d
wird nicht unterstützt (nicht in POSIX, sondern in GNU grep -P
).
[[:digit:]]
wird von POSIX benötigt, um der Ziffernklasse zu entsprechen, die wiederum von ISO C benötigt wird, um die Zeichen 0 bis 9 und nichts anderes zu sein. Also nur in C locale alle [0-9]
, [0123456789]
, \d
und [[:digit:]]
bedeutet genau das gleiche. Das [0123456789]
hat keine möglichen Fehlinterpretationen, [[:digit:]]
ist in mehr Dienstprogrammen verfügbar und gemeinhin nur gemeint [0123456789]
. Das \d
wird von wenigen Dienstprogrammen unterstützt.
Was [0-9]
ist die Bedeutung des Bereichs Ausdrücke nur von POSIX in der C - Sprache definiert; In anderen Ländern kann es anders sein (Codepoint-Reihenfolge oder Sortierreihenfolge oder etwas anderes).
Muscheln
Einige Implementierungen verstehen einen Bereich möglicherweise als etwas anderes als eine reine ASCII-Reihenfolge (z. B. ksh93):
$ LC_ALL=en_US.utf8 ksh -c 'a="'"$a"'";echo "${a//[0-9]}"'
۹ ߀߁߂߃߄߅߆߇߈߉ ९
Und das ist eine sichere Quelle von Fehlern, die darauf warten, passiert zu werden.