POSIXには、次のように定義された「文字クラス」があります。LC_CTYPE ロケール定義次のような(12)名前があります。
alnum alpha blank cntrl digit graph lower print punct space upper xdigit
として使用されます[[:lower:][:digit:]]
。
それぞれは非常に正確な文字リストを定義するように設定されています。
たとえば、digit
文字のみを含める必要があります0123456789
。
しかし、時間が経つにつれて使用されるとaの正確な定義はdigit
絶えず変わっています。。 Perlは明らかに.Grep以上と一致する可能性0123456789
があります0123456789
。
$ echo '0123456789 ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ ߀߁߂߃߄߅߆߇߈߉ ०१२३४५६७८९' |
grep -o '[0-9]\+'
0123456789
٠١٢٣٤٥٦٧٨
۰۱۲۳۴۵۶۷۸
߀߁߂߃߄߅߆߇߈
०१२३४५६७८
これは、一般的に使用される文字の国際化への圧力によるものです。例:ギリシャ国民の場合は、αβγδεζηθικλμνξοπρσςτυφχψω
次のように考えます。減らす大文字と小文字。しかし、これは定義されていません。実際、これらのすべての「文字クラス」にはこれらの制限が追加されます。POSIXページ定義:
POSIX ロケールで
これは、文字クラスがCロケールでのみ定義され有効であることを示します。
これは、安定した、明確に定義された文字のリストを必要とするプログラマーにとって最も便利です。
これは、プログラマにとって合理的に見えることだけを[0-9]
意味できます。繰り返しますが、これはプログラマーにのみ意味があるようです。しかし、「小文字」と読む場合、ギリシャ国民には文字を含まないことが不合理に見えるはずです。これは、コンビネーションオーダーのユーザー(Cを除く)にとっては不合理に見えるかもしれませんが、これは、無実のユーザーにとって予期しないことです。多くのユーザーが範囲に大文字が含まれていると文句を言った。0123456789
[a-z]
abcdefghijklmnopqrstuvwxyz
[a-z]
αβγδεζηθικλμνξοπρσςτυφχψω
[a-z]
aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYz
[a-z]
簡単に言えば、文字クラスはCロケールに対してのみ定義されます。
残りのロケールはまだ定義されていないため使用できません。ギリシャ語では小文字を要求できません。または文字の範囲内に含めます。 Webページですべての言語を簡単に使用できる今日のコンピュータの世界では、これは衝撃的なことです。
これでこれを改善できます。
現在の多様性を制限しようとする説明は失敗する可能性が高いです。新しい構文が必要です。文字クラスを拡張して、文字クラスが望む意味を正確に書くとどうなりますか?
Only digits from ASCII: [:as:digit:] <==> 0123456789
Only digits from English: [:en:digit:] <==> 0123456789
Only digits from Persian (Farsi): [:fa:digit:] <==> ۰۱۲۳۴۵۶۷۸۹
Only lowercase letters from English: [:en:lower:] <==> abcdefghijklmnopqrstuvwxyz
Only lowercase letters from Greek: [:el:lower:] <==> αβγδεζηθικλμνξοπρσςτυφχψω
Only uppercase from Russian: [:ru:upper:] <==> БВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
.
.
etc.
すべて/すべてのロケールで安定しており、同じです(ロケールが文字をエンコードできる場合)。
一部のユーティリティ(grep、sed、bashなど)でこのアイデアを実装するには、誰に連絡する必要がありますか?
ベストアンサー1
この問題は、POSIXのワイド文字機能を使用して解決されました。から始まる<wctype.h>
そして<wchar.h>
、これは以下に関連しています。現在のロケールと<locale.h>
これがどのロケールかを指定するために使用されます。
正規表現で関連していない複数のロケールを参照するために特別な構文を追加する必要性を発見した人は誰もいないようです。