1. ホーム
  2. c#

ペルシャ文字のみを受け入れるための正規表現

2023-11-22 21:49:30

質問

あるフォームで、カスタムバリデーターがペルシャ文字しか受け付けないようにしています。 以下のコードを使用しました。

var myregex = new Regex(@"^[\u0600-\u06FF]+$");
if (myregex.IsMatch(mytextBox.Text))
{
    args.IsValid = true;
}
else
{
    args.IsValid = false;
}

しかし、ペルシア語の文字には対応していないため、アラビア語しか検出できないようです(گ,چ,پ,ژの4文字が欠落しています)。

この問題を解決する方法はありますか?

どのように解決するのですか?

TL;DR

ペルシャ語は以下のような文字セットが必須となります。

  • 使用する ^[آابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی]+$ を使用するか、正規表現のフレーバーに応じたコードポイントを使用します(すべてのエンジンが \uXXXX の表記をサポートしていないものもあります)。

    ^[\u0622\u0627\u0628\u067E\u062A-\u062C\u0686\u062D-\u0632\u0698\u0633-\u063A\u0641\u0642\u06A9\u06AF\u0644-\u0648\u06CC]+$
    
    
  • 使用方法 ^[۰۱۲۳۴۵۶۷۸۹]+$ を使ってください。

    ^[\u06F0-\u06F9]+$
    
    
  • 使用方法 [ ‬ٌ ‬ًّ ‬َ ‬ِ ‬ُ ‬ْ ‬] を使うか、正規表現にこだわります。

    [\u202C\u064B\u064C\u064E-\u0652]
    
    

といった具合に、組み合わせて使うこともできます。ハムザのような他のアラビア文字を追加することもできます。 ء のような他のアラビア文字を文字セットに追加することもできます。

なぜ [\u0600-\u06FF][آ-ی] の両方が間違っているのでしょうか?

とはいえ \u0600-\u06FF が含まれます。

  • گ コードポイント付き 06AF
  • چ コードポイント付き 0686
  • پ コードポイント付き 067E
  • ژ コードポイント付き 0698

を示唆するすべての回答も [\u0600-\u06FF] または [آ-ی] は単純に間違っています。

すなわち \u0600-\u06FF には 209 のように、必要以上に多くの文字が含まれています!しかも数字も含まれています。

全文

この回答は、よくある誤解を修正するために存在します。コードポイント 0600 を通して 06FF を表すものではありません。 ペルシャ語 / ペルシャ語アルファベット (どちらも [آ-ی] ):

[\u0600-\u0605 ؐ-ؚ\u061Cـ ۖ-\u06DD ۟-ۤ ۧ ۨ ۪-ۭ ً-ٕ ٟ ٖ-ٞ ٰ ، ؍ ٫ ٬ ؛ ؞ ؟ ۔ ٭ ٪ ؉ ؊ ؈ ؎ ؏
۞ ۩ ؆ ؇ ؋ ٠۰ ١۱ ٢۲ ٣۳ ٤۴ ٥۵ ٦۶ ٧۷ ٨۸ ٩۹ ءٴ۽ آ أ ٲ ٱ ؤ إ ٳ ئ ا ٵ ٮ ب ٻ پ ڀ
ة-ث ٹ ٺ ټ ٽ ٿ ج ڃ ڄ چ ڿ ڇ ح خ ځ ڂ څ د ذ ڈ-ڐ ۮ ر ز ڑ-ڙ ۯ س ش ښ-ڜ ۺ ص ض ڝ ڞ
ۻ ط ظ ڟ ع غ ڠ ۼ ف ڡ-ڦ ٯ ق ڧ ڨ ك ک-ڴ ػ ؼ ل ڵ-ڸ م۾ ن ں-ڽ ڹ ه ھ ہ-ۃ ۿ ەۀ وۥ ٶ
ۄ-ۇ ٷ ۈ-ۋ ۏ ى يۦ ٸ ی-ێ ې ۑ ؽ-ؿ ؠ ے ۓ \u061D]

255文字に該当するのは アラビア語ブロック (0600-06FF)の場合、ペルシャ語のアルファベットは32文字で、これにペルシャ語の数字のデモを加えると42文字になります。これに母音(もともとアラビア語の母音で、ペルシャ語ではほとんど使われない)を加えると タンビン ( ً , ٍِ ‬ , ٌ ‬ ) と タシード ( ّ ‬ ) は両方ともペルシャ語ではなくアラビア語の発音区分のサブセットであるため、46文字になってしまいます。つまり \u0600-\u06FF には必要な文字数より209文字も多く含まれていることになります!

۷ をコードポイントとして 06F7 はペルシャ語の数字表現で 7 であり ٧ をコードポイントとして 0667 は同じ数のアラビア語表現である。 ۶ はペルシャ語の数字 6 であり ٦ は同じ数のアラビア語表現です。そして、すべて存在するのは 0600 を通して 06FF のコードポイントがあります。

ペルシャ数字の4の形( ۴ ), 5 ( ۵ )、および6個( ۶ ) は はアラビア語で使われる形とは異なり、他の数字はコードポイントが異なります。 コードポイントが異なります。

ペルシャ語には存在しない他の文字も見ることができ、ファーストネームや姓を検証する際に、誰もそれらを使いたがらないのです。

[آ-ی] には117の文字が含まれていますが、これは検証のために必要な文字数よりもはるかに多いものです。これらの文字をすべて見るには ユニコードCLDR .