存在する正規表現に関するウィキペディア記事、[[:digit:]]
==のようです [0-9]
。\d
どのような状況では、彼らは同等ではありませんか?違いは何ですか?
いくつかの調査による1つの違いは、角かっこ表現が[:expr:]
ロケールによって異なることです。
ベストアンサー1
はい、はい[[:digit:]]
〜〜(ここでは〜は近似を意味します)。ほとんどのプログラミング言語では(サポートされている言語)[0-9]
\d
\d ≡ `[[:digit:]]` # (is identical to, it is a short hand for).
(POSIXでは使用可能ですが、POSIXでは使用できません)\d
よりもインスタンス数が少なくなります。[[:digit:]]
grep -P
Unicode番号
持つUnicode の多数、例えば:
123456789 # Hindu-Arabic
アラビア数字
٠١٢٣٤٥٦٧٨٩ # ARABIC-INDIC
۰۱۲۳۴۵۶۷۸۹ # EXTENDED ARABIC-INDIC/PERSIAN
߀߁߂߃߄߅߆߇߈߉ # NKO DIGIT
०१२३४५६७८९ # DEVANAGARI
これらすべて含めることができるで[[:digit:]]
またはで\d
、さらに場合によっては[0-9]
。
POSIX
特定のPOSIX BREまたはEREの場合:
サポートされていません\d
(POSIXではなくGNUではgrep -P
)。
[[:digit:]]
POSIX では数値文字クラスが必要ですが、ISO C では数値文字クラスは 0 から 9 までのみ必要です。だからCロケールのみ[0-9]
、、、およびすべてが[0123456789]
まったく同じ意味を持ちます。より多くのユーティリティで使用できる誤解はなく、場合によっては意味します。これをサポートするユーティリティはほとんどありません。\d
[[:digit:]]
[0123456789]
[[:digit:]]
[0123456789]
\d
それに関しては[0-9]
、範囲式の意味は C ロケールの POSIX によってのみ定義されます。他のロケールでは異なる場合があります(おそらくコードポイントの順序や照合順序など)。
[0123456789]
すべてのASCII番号の最も基本的なオプションです。
常に有効です。 (AFAICT) 既知の失敗事例はありません。
英語の数字のみが一致します0123456789
。
[0-9]
[0-9]
通常はASCII番号と考えられています0123456789
。
場合によっては、これが非常に間違っている場合があります。次のように、「C」ではなく一部のシステム(2020年6月)システムのロケールにあるLinuxです。
考える:
str='0123456789 ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ ߀߁߂߃߄߅߆߇߈߉ ०१२३४५६७८९'
grep
最も許容されるものを見つけてください。
$ echo "$str" | grep -o '[0-9]\+'
0123456789
٠١٢٣٤٥٦٧٨
۰۱۲۳۴۵۶۷۸
߀߁߂߃߄߅߆߇߈
०१२३४५६७८
sedに問題があります。削除する必要が0123456789
ありますが、ほぼすべての番号を削除する必要があります。これは、ほとんどの数字を許可しますが、一部の9(???)は許可しません。
$ echo "$str" | sed 's/[0-9]\{1,\}//g'
٩ ۹ ߉ ९
exprもsedのような問題を抱えています。
expr "$str" : '\([0-9 ]*\)' # also matching spaces.
0123456789 ٠١٢٣٤٥٦٧٨
そして編集者
printf '%s\n' 's/[0-9]/x/g' '1,p' Q | ed -v <(echo "$str")
105
xxxxxxxxxx xxxxxxxxx٩ xxxxxxxxx۹ xxxxxxxxx߉ xxxxxxxxx९
[[:数値:]]
Perl、Java、Python、Cなど、さまざまな言語があります。ここで[[:digit:]]
(および\d
)には拡張意味が必要です。たとえば、次のPerlコードは上記のすべての数字と一致します。
$ str='0123456789 ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ ߀߁߂߃߄߅߆߇߈߉ ०१२३४५६७८९'
$ echo "$str" | perl -C -pe 's/[^\d]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
Numeric
これは、Unicode属性を持つすべての文字を選択するのと同じですdigits
。
$ echo "$str" | perl -C -pe 's/[^\p{Nd}]//g;' ; echo
0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९
再現可能なgrep(特定のバージョンのpcreはPerlとは異なる内部数値コードポイントのリストを持つことができます):
$ echo "$str" | grep -oP '\p{Nd}+'
0123456789
٠١٢٣٤٥٦٧٨٩
۰۱۲۳۴۵۶۷۸۹
߀߁߂߃߄߅߆߇߈߉
०१२३४५६७८९
シェル
一部の実装では、範囲は通常のASCIIシーケンス(例:ksh93)とは異なると理解できます(2018年5月ビルド(AT&T Research)93u + 2012-08-01でテストした場合)。
$ LC_ALL=en_US.utf8 ksh -c 'echo "${1//[0-9]}"' sh "$str"
۹ ߀߁߂߃߄߅߆߇߈߉ ९
現在(2020年6月)、debianの同じパッケージksh93(同じバージョンsh(AT&T Research)93u + 2012-08-01):
$ LC_ALL=en_US.utf8 ksh -c 'echo "${1//[0-9]}"' sh "$str"
٩ ۹ ߉ ९
これがまもなく差し迫ったエラーの原因のようです。