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?
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-point06AF
چ
avec CO-point0686
پ
avec CO-point067E
ژ
avec codepoint0698
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!
Toute l'histoire
cette réponse existe pour corriger une méprise courante. Codepoints 0600
06FF
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 0600
06FF
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.
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]+$
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é :
- \u200C:http://en.wikipedia.org/wiki/Zero-width_non-joiner
- \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('ایپسر تو چه میدانی؟')
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/
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:
- arabe:http://www.unicode.org/charts/PDF/U0600.pdf
- Arabe Supplément: http://www.unicode.org/charts/PDF/U0750.pdf
- Arabe Étendu-Un: http://www.unicode.org/charts/PDF/U08A0.pdf
- Formulaires De Présentation En Arabe-A: http://www.unicode.org/charts/PDF/UFB50.pdf
- Arabe De Formulaires De Présentation-B: http://www.unicode.org/charts/PDF/UFE70.pdf
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
Je ne peux pas lire le Farsi mais voir si l'un des suppléments en arabe unicode ont les lettres que vous recherchez.
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
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.