Vâng, đó là [[:digit:]]
~ [0-9]
~ \d
(trong đó ~ có nghĩa là aproximate).
Trong hầu hết các ngôn ngữ lập trình (nơi nó được hỗ trợ) \d
≡ [[:digit:]]
(giống hệt nhau).
Điều \d
này ít phổ biến hơn [[:digit:]]
(không phải trong POSIX mà là trong GNU grep -P
).
Có nhiều chữ số trong UNICODE , ví dụ:
123456789 # Hindu-Arabic
Chữ số Ả Rập
٠١٢٣٤٥٦٧٨٩ # ARABIC-INDIC
۰۱۲۳۴۵۶۷۸۹ # EXTENDED ARABIC-INDIC/PERSIAN
߀߁߂߃߄߅߆߇߈߉ # NKO DIGIT
०१२३४५६७८९ # DEVANAGARI
Tất cả trong số đó có thể được bao gồm trong [[:digit:]]
hoặc \d
.
Thay vào đó, [0-9]
nói chung chỉ là các chữ số ASCII 0123456789
.
Có nhiều ngôn ngữ: Perl, Java, Python, C. Trong đó [[:digit:]]
(và \d
) gọi một nghĩa mở rộng. Ví dụ: mã perl này sẽ khớp với tất cả các chữ số ở trên:
$ a='0123456789 ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ ߀߁߂߃߄߅߆߇߈߉ ०१२३४५६७८९'
$ echo "$a" | perl -C -pe 's/[^\d]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Tương đương với việc chọn tất cả các ký tự có thuộc tính Unicode Numeric
và digits
:
$ echo "$a" | perl -C -pe 's/[^\p{Nd}]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Grep nào có thể sao chép (phiên bản cụ thể của pcre có thể có một danh sách nội bộ khác nhau về các điểm mã số so với Perl):
$ echo "$a" | grep -oP '\p{Nd}+'
0123456789
٠١٢٣٤٥٦٧٨٩
۰۱۲۳۴۵۶۷۸۹
߀߁߂߃߄߅߆߇߈߉
०१२३४५६७८९
Thay đổi nó thành [0-9] để xem:
$ echo "$a" | grep -o '[0-9]\+'
0123456789
POSIX
Đối với POSIX BRE hoặc ERE cụ thể:
Không \d
được hỗ trợ (không phải trong POSIX mà là GNU grep -P
).
[[:digit:]]
được POSIX yêu cầu tương ứng với lớp ký tự chữ số, lần lượt được ISO C yêu cầu là các ký tự từ 0 đến 9 và không có gì khác. Vì vậy, chỉ trong C Locale tất cả [0-9]
, [0123456789]
, \d
và [[:digit:]]
có nghĩa là giống hệt nhau. Các [0123456789]
không có người hiểu nhầm có thể, [[:digit:]]
có sẵn trong tiện ích hơn và người ta thường có nghĩa là chỉ [0123456789]
. Các \d
được hỗ trợ bởi vài tiện ích.
Đối với [0-9]
, ý nghĩa của các biểu thức phạm vi chỉ được xác định bởi POSIX trong miền địa phương C; ở các địa phương khác, nó có thể khác (có thể là thứ tự mã hóa hoặc thứ tự đối chiếu hoặc thứ gì khác).
vỏ sò
Một số triển khai có thể hiểu một phạm vi là một cái gì đó khác với thứ tự ASCII đơn giản (ví dụ ksh93):
$ LC_ALL=en_US.utf8 ksh -c 'a="'"$a"'";echo "${a//[0-9]}"'
۹ ߀߁߂߃߄߅߆߇߈߉ ९
Và đó là một nguồn chắc chắn của lỗi đang chờ xảy ra.