Unicode番号

Unicode番号

存在する正規表現に関するウィキペディア記事[[: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"

 ٩ ۹ ߉ ९

これがまもなく差し迫ったエラーの原因のようです。

おすすめ記事