regex pour n'accepter que des caractères persans

je travaille sur un formulaire que l'un de ses validateurs ne devrait accepter que les caractères persans...J'ai utilisé le code suivant:

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

mais il semble qu'il ne fonctionne que pour vérifier les caractères arabes et il ne couvre pas tous les caractères persans (il manque ces quatre փ փ,փ փ,փ )... est-il un moyen pour résoudre ce problème?

28
demandé sur Jegadeesh 2014-03-21 21:07:31

8 réponses

TL;DR

Farsi DOIT utilisé les jeux de caractères sont de la forme suivante:

  • Utiliser ^[آابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی]+$ pour les lettres ou utilisez des codépoints concernant votre saveur regex (tous les moteurs ne supportent pas \uXXXX la notation):

    ^[\u0622\u0627\u0628\u067E\u062A-\u062C\u0686\u062D-\u0632\u0698\u0633-\u063A\u0641\u0642\u06A9\u06AF\u0644-\u0648\u06CC]+$
    
  • Utiliser ^[۰۱۲۳۴۵۶۷۸۹]+$ pour les numéros ou sur votre regex saveur:

    ^[\u06F0-\u06F9]+$
    
  • Utiliser [ ‬ٌ ‬ًّ ‬َ ‬ِ ‬ُ ‬ْ ‬] pour les voyelles ou concernant votre regex saveur:

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

ou une combinaison de ceux-ensemble. Vous pouvez ajouter d'autres lettres arabes comme Hamza ء à votre jeu de caractères en plus.

Pourquoi [\u0600-\u06FF] et [آ-ی] tous les deux faux?

bien que \u0600-\u06FF comprend:

  • گ avec CO-point 06AF
  • چ avec CO-point 0686
  • پ avec CO-point 067E
  • ژ avec codepoint 0698

ainsi, toutes les réponses qui suggèrent [\u0600-\u06FF] ou [آ-ی] sont tout simplement faux.

i.e. \u0600-\u06FF contient 209 plus de caractères que vous avez besoin! et il comprend des nombres aussi!

enter image description here

Toute l'histoire

cette réponse existe pour corriger une méprise courante. Codepoints 060006FF ne pas dénoter alphabet Persan / Farsi (ni [آ-ی]):

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

255 caractères sont tombés sous bloc arabe (0600-06FF), L'alphabet Farsi a 32 lettres qu'en plus de la démonstration Farsi de chiffres il serait 42. Si nous ajoutons des voyelles (voyelles arabes à l'origine, rarement utilisées en Farsi) sans Tanvin (ً,ٍِ ‬,ٌ ‬ et Tashdid (ّ ‬) qui sont à la fois un sous-ensemble de la diacritique Arabe pas Farsi, nous finirions avec 46 caractères. Cela signifie \u0600-\u06FF contient 209 caractères de plus que vous n'en avez besoin!

۷ avec CO-point 06F7 est une représentation Farsi de nombre 7 et ٧ avec CO-point 0667 est une représentation arabe du même nombre. ۶ est Farsi représentation de nombre 6 et ٦ est une représentation arabe du même nombre. Et tous résident dans 060006FF codepoints.

les formes des quatre chiffres persans (۴), cinq (۵), et six (۶) sont différent des formes utilisées en arabe et les autres nombres ont différents codépoints.

vous pouvez voir un nombre différent d'autres caractères qui n'existent pas en Farsi / persan aussi et personne n'est prêt à les avoir tout en validant un prénom ou un nom de famille.

[آ-ی] comprend aussi 117 caractères ce qui est beaucoup plus que ce dont quelqu'un a besoin pour la validation. Vous pouvez les voir tous en utilisant Unicode CLDR.

24
répondu revo 2018-09-06 09:10:13

Ce que vous avez actuellement dans votre regex est un échelle standard des symboles Arabes. Pour les caractères supplémentaires, vous devez les ajouter à la regex séparément. Voici leurs codes:

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

donc tout dans tout vous devriez avoir

^[\u0600-\u06FF\u0698\u067E\u0686\u06AF]+$
25
répondu Andrei 2017-07-11 22:16:10

en plus de la réponse acceptée(https://stackoverflow.com/a/22565376/790811), nous devrions aussi considérer les caractères zero-width_non-joiner (ou Malheureusement, nous avons deux symboles pour cela. L'une standard et l'autre n'est pas standard mais largement utilisé :

  1. \u200C:http://en.wikipedia.org/wiki/Zero-width_non-joiner
  2. \u200F : marque de droite à gauche (http://unicode-table.com/en/#200F)

final regix peut être :

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

Si vous voulez considérer "espace", vous pouvez utiliser ceci :

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

vous pouvez le tester JavaScript par ceci:

/^[\u0600-\u06FF\uFB8A\u067E\u0686\u06AF7\u200C\u200F ]+$/.test('ای‌پسر تو چه می‌دانی؟')
9
répondu Mahmoud Moravej 2017-05-23 11:54:34

attention: persianRex est écrit en Javascript cependant vous pouvez utiliser le code source et copier coller les caractères

la détection des caractères persans est une tâche délicate en raison de la très grande variété de la disposition des claviers et des systèmes d'exploitation. J'ai été confrontée au même défi un peu avant, et j'ai décidé d'écrire une bibliothèque open source pour résoudre ce problème.

vous pouvez résoudre votre problème comme ceci: persianRex.texte.test (yourInput); / / retourne true ou false

voici la documentation complète: http://imanmh.github.io/persianRex/

5
répondu Iman Mohamadi 2016-01-28 07:40:40

Farsi, Dari et Tadjik sont hors de mon Bailliage, mais un peu fouiller dans les chartes de code Unicode me dit que l'arabe couvre 5 blocs de code Unicode:

Vous pouvez les obtenir (au moins certains d'entre eux) dans des expressions régulières en utilisant nommé blocs au lieu de plages de points de code explicites:\p{IsArabicPresentationForms-A} vous donnera le 4ème bloc Unicode dans la liste précédente.

vous pourriez aussi lire persan Computing en Unicode: http://behdad.org/download/Publications/persiancomputing/a007.pdf

3
répondu Nicholas Carey 2014-03-21 17:29:50

Je ne peux pas lire le Farsi mais voir si l'un des suppléments en arabe unicode ont les lettres que vous recherchez.

http://www.unicode.org/charts/

1
répondu Babak Naffas 2014-03-21 17:15:33

the named blocks, E. G \ P {Arabic} couvrir la totalité alphabet arabe, pas seulement les caractères persans.

Les formulaires de présentation (u+FB50-u+FDFF) devraient doit être utilisé dans le texte, et doit être converti à la gamme standard (u+0600-u+06FF).

afin de couvrir seulement la perse nous avons besoin de ce qui suit:

  • le sous-ensemble des caractères Farsi hors de la plage arabe standard, I. e (U+0621-U+0624, U+0626-U+063A, U+0641-U+0642, U+0644-U+0648)
  • L'arabe standard signes diacritiques (U+064B-U+0652)
  • les 2 autres diacritiques (U+0654, U+0670)
  • the 4 extra Farsi characters" & # 160; " (U+067e, U+0686, U+0698, U+06AF)
  • U+06A9: persan Kaf (officiellement: "la Lettre arabe Keheh", différente de la notation de l'arabe Kaf)
  • U+06CC: Farsi Yeh (une notation différente de l'arabe Yeh)
  • U+200C: Largeur Zéro-Non-Joiner

Donc, le résultant regexp serait:

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

Voir aussi le modèle de caractères pour le persan répertoriés ici:

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

1
répondu stazari 2017-07-11 21:37:40

Je ne suis pas sûr si regex est la façon de le faire, cependant le problème n'est pas spécifique à seulement persan ou arabe, chinois, texte russe. alors peut-être pourriez-vous voir si le le caractère existe dans votre page de code, si ce n'est pas dans la page de code, je doute que l'utilisateur puisse les insérer en utilisant un périphérique d'entrée....

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

le test teste un aller-retour où l'entrée doit correspondre à la chaîne de caractères bytes et back. Le lien montre les pages de code supportées.

0
répondu Computer Aided Trading Systems 2018-05-18 08:28:10