web-dev-qa-db-ja.com

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

カスタムバリデーターの1つがペルシア語の文字のみを受け入れるフォームに取り組んでいます。次のコードを使用しました。

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

ただし、ペルシャ語のすべての文字をカバーしているわけではないため、アラビア語の文字しか検出できないようです(これらの4つが不足しています:گ、چ、پ、ژ)。

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

49
NikiUsefi

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]
    

またはそれらの組み合わせ。 Hamza ءなどの他のアラビア文字を文字セットに追加することもできます。

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

\u0600-\u06FFには以下が含まれますが:

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

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

つまり、\u0600-\u06FFには 209 が必要以上の文字が含まれています!数字も入っています!

enter image description here

全編

この答えは、一般的な誤解を修正するためにあります。コードポイント0600から06FFは、ペルシア語/ペルシア語のアルファベットを示しません([آ-ی]も示しません):

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

255文字は アラビア語のブロック (0600–06FF)に分類されます。ペルシア語のアルファベットは32文字で、ペルシア語の数字のデモンストレーションに加えて42になります。母音(元々アラビア語の母音、ペルシア語)Tanvinًٍِ ‬ٌ ‬)およびTashdidなし(ّ ‬)どちらもペルシア語ではなくアラビア語の発音区別符号のサブセットであり、46文字になります。つまり、\u0600-\u06FFには、必要以上の209文字が含まれています。

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

ペルシア語の数字4(۴)、5(۵)、および6(۶)の形状は、アラビア語で使用される形状とは異なり、他の数字は異なるコードポイントを持っています。

ペルシア語やペルシャ語には存在しない他の文字もさまざまな数で表示され、名や姓を検証するときに誰もその文字を使用することはできません。

[آ-ی]には117文字も含まれ、これは誰かが検証に必要なものをはるかに超えています。それらはすべてnicode CLDRを使用して表示できます。

50
revo

あなたが現在あなたの正規表現に持っているものは 標準のアラビア語記号の範囲 です。追加の文字については、それらを個別に正規表現に追加する必要があります。ここにそれらのコードがあります:

ژ \u0698
پ \u067E
چ \u0686
گ \u06AF

だからすべてのあなたが持っているべきです

^[\u0600-\u06FF\u0698\u067E\u0686\u06AF]+$
26
Andrei

受け入れられた回答( https://stackoverflow.com/a/22565376/790811 )に加えて、Zero-width_non-joiner(またはペルシア語ではنیمفاصله)文字も考慮する必要があります。残念ながら、2つのシンボルがあります。 1つは標準で、もう1つは標準ではありませんが広く使用されています。

  1. \ u200C: http://en.wikipedia.org/wiki/Zero-width_non-joiner
  2. \ u200F:右から左へのマーク( http://unicode-table.com/en/#200F

したがって、finalregixは次のようになります。

^[\u0600-\u06FF\uFB8A\u067E\u0686\u06AF\u200C\u200F]+$

space」を検討したい場合は、これを使用できます。

^[\u0600-\u06FF\uFB8A\u067E\u0686\u06AF\u200C\u200F ]+$

これでJavaScriptをテストできます:

/^[\u0600-\u06FF\uFB8A\u067E\u0686\u06AF7\u200C\u200F ]+$/.test('ای‌پسر تو چه می‌دانی؟')
11
Mahmoud Moravej

注意:persianRexはJavaScriptで記述されていますが、ソースコードを使用して文字をコピーして貼り付けることができます。

ペルシャ語の文字の検出は、キーボードのレイアウトやオペレーティングシステムが多岐にわたるため、難しい作業です。以前にも同じ問題に直面し、この問題を修正するためにオープンソースライブラリを作成することにしました。

次のように問題を修正できます:persianRex.text.test(yourInput); // trueまたはfalseを返します

ここに完全なドキュメントがあります: http://imanmh.github.io/persianRex/

6
Iman Mohamadi

ペルシア語、ダリ語、タジク語は私のバイリウィックの外にありますが、Unicodeコードチャートを少し調べてみると、アラビア語が5つのUnicodeコードブロックをカバーしていることがわかります。

明示的なコードポイント範囲の代わりに 名前付きブロック を使用して、正規表現でそれら(少なくとも一部)を取得できます:\p{IsArabicPresentationForms-A}は、上記のリストの4番目のUnicodeブロックを提供します。

Unicodeのペルシャコンピューティングもお読みください: http://behdad.org/download/Publications/persiancomputing/a007.pdf

3
Nicholas Carey

名前付きブロック、たとえば\ p {アラビア語}は、ペルシア語の文字だけでなくアラビア語のスクリプト全体をカバーします。

プレゼンテーションフォーム(u + FB50-u + FDF​​F)はテキストでnotを使用する必要があり、標準範囲(u + 0600- u + 06FF)。

ペルシャ語のみをカバーするために、以下が必要です。

  • 標準のアラビア語の範囲外のペルシア語文字のサブセット、つまり(U + 0621-U + 0624、U + 0626-U + 063A、U + 0641-U + 0642、U + 0644-U + 0648)
  • 標準のアラビア語の発音区別符号(U + 064B-U + 0652)
  • 2つの追加発音区別符号(U + 0654、U + 0670)
  • 4つの追加ペルシア語文字「گچپژ」(U + 067E、U + 0686、U + 0698、U + 06AF)
  • U + 06A9:ペルシャ語のカフ(正式には「アラビア語の文字Keheh」、アラビア語のカフとは異なる表記)
  • U + 06CC:ペルシアイエ(アラビア語イエとは異なる表記法)
  • U + 200C:ゼロ幅、非ジョイナー

したがって、結果の正規表現は次のようになります。

^[\u0621-\u0624\u0626-\u063A\u0641-\u0642\u0644-\u0648\u064B-\u0652\u067E\u0686\u0698\u06AF\u06CC\u06A9\u0654\u670\u200c}]+$

ここにリストされているペルシア語の模範文字も参照してください。

http://unicode.org/cldr/trac/browser/trunk/common/main/fa.xml

1
stazari

正規表現がこれを行う方法であるかどうかはわかりませんが、問題はペルシャ語またはアラビア語、チニー、ロシア語のテキストのみに固有のものではありません。 文字がコードページに存在する かどうかを確認できるかもしれません。コードページにない場合、ユーザーが入力デバイスを使用してそれらを挿入できるかどうかは疑問です...

 var encoding = Encoding.GetEncoding(1256);
 var expect = "گ چ پ ژ";
 var actual= encoding.GetBytes("گ چ پ ژ");
 Assert.AreEqual(encoding.GetString(actual),expect);

このテストでは、入力が文字列とバイトを照合して往復する往復をテストします。リンクには、サポートされているコードページが表示されます。

0
Walter Vehoeven