正则表达式只接受波斯字符

Nik*_*efi 44 c# regex asp.net unicode

我正在处理一个表单,其中一个自定义验证器应该只接受波斯语字符...我使用了以下代码:

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

但它似乎只适用于检查阿拉伯字符而且它不包括所有波斯字符(它缺少这四个گ,چ,پ,ژ)...有没有办法解决这个问题?

rev*_*evo 62

TL; DR

波斯语必须使用的字符集如下:

或这些在一起的组合.您可能还想在其他?字符集中添加其他阿拉伯字母,如Hamza .

为什么[\u0600-\u06FF][?-?]这两个问题?

虽然\u0600-\u06FF包括:

  • ? 使用codepoint 06AF
  • ? 使用codepoint 0686
  • ? 使用codepoint 067E
  • ? 使用codepoint 0698

所有答案都表明[\u0600-\u06FF]或者[?-?]只是错误.

\u0600-\u06FF包含超过您需要的209个字符!它也包括数字!

在此输入图像描述

整个故事

这个答案的存在是为了解决一个常见的误解.0600通过代码点06FF不表示波斯语/波斯语字母表(也不表示[?-?]):

[\u0600-\u0605 ?-?\u061C? ?-\u06DD ?-? ? ? ?-? ?-? ? ?-? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?-? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?-? ? ? ? ?-? ? ? ? ?-? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ?-? ? ? ? ? ? ?-? ? ? ? ?-? ?? ? ?-? ? ? ? ?-? ? ?? ?? ?
?-? ? ?-? ? ? ?? ? ?-? ? ? ?-? ? ? ? \u061D]
Run Code Online (Sandbox Code Playgroud)

阿拉伯语块(0600-06FF)下有255个字符,波斯语字母表有32个字母,除了波斯语数字显示之外,还有42个字母.如果我们添加元音(阿拉伯语元音本来就很少用于波斯语)而没有Tanvin(?,?? ?,? ?)和Tashdid(? ?)既是阿拉伯语变音符号的子集,也不是波斯语,我们最终会有46个字符.这意味着\u0600-\u06FF包含209个超过你需要的字符!

?with codepoint 06F7是一个数字的波斯语表示,7?codepoint 0667是阿拉伯语相同数字的表示.?是数字的波斯语表示,6并且?是相同数字的阿拉伯语表示.所有这些都0600通过06FF代码点存在.

波斯数字four(?),five(?)和six(?)的形状与阿拉伯语中使用的形状不同,其他数字具有不同的代码点.

你可以看到在波斯语/波斯语中也不存在不同数量的其他字符,没有人愿意在验证名字或姓氏时拥有它们.

[?-?]还包括117个字符,远远超过某人验证所需的字符.您可以使用Unicode CLDR查看它们.

  • 嗨,雷沃。嘿,我正在阅读您关于波斯语的维基百科页面。我只是想指出这个`[\u0622\u0627\u0628\u067E\u062A-\u062C\u0686\u062D-\u0632\u0698\u0633-\u063A\u0641\u0642\u06A9\u06AF\u0644-\u0648\ u06CC]` 包含所有阿拉伯字母 Unicode 名称。我想这很难区分,也许这就是为什么波斯语/波斯语没有 Unicode 脚本的原因。 (2认同)
  • 做得好.我不知道波斯语(但不是关于波斯语诗歌),但是用单个代码点和带有组合字符的代码点来处理不同形式的字符(如果有的话,正如你在其他语言中看到的那样). (2认同)
  • @CasimiretHippolyte谢谢.我很高兴听到你了解我们的诗歌,你提出了一个有效的观点,但我们没有任何变音标记,阿拉伯语已经存在并且这就是这个答案存在的主要原因. (2认同)
  • 干得好,指出虽然阿拉伯语和波斯语字母相似,但它们并不相同。这是我以前在这个网站上看到的一个错误。 (2认同)

And*_*rei 29

您目前在正则表达式中拥有的是标准的阿拉伯符号范围.对于其他字符,您需要单独将它们添加到正则表达式.这是他们的代码:

? \u0698
? \u067E
? \u0686
? \u06AF
Run Code Online (Sandbox Code Playgroud)

总而言之,你应该拥有

^[\u0600-\u06FF\u0698\u067E\u0686\u06AF]+$
Run Code Online (Sandbox Code Playgroud)

  • `\u0600-\u06FF` 不包含 `\u0698` 或其他附加代码点吗? (3认同)

Mah*_*vej 12

除了接受的答案(/sf/answers/1579576351/)之外,我们还应该考虑Zero-width_non-joiner(或波斯语中的نیمفاصله)字符.不幸的是我们有2个符号.一个是标准的,另一个不是标准的,但广泛使用:

  1. \ u200C:http://en.wikipedia.org/wiki/Zero-width_non-joiner
  2. \ u200F:从右到左的标记(http://unicode-table.com/en/#200F)

所以最终的 regix可以是:

^[\u0600-\u06FF\uFB8A\u067E\u0686\u06AF\u200C\u200F]+$
Run Code Online (Sandbox Code Playgroud)

如果你想考虑" 空间 ",你可以使用这个:

^[\u0600-\u06FF\uFB8A\u067E\u0686\u06AF\u200C\u200F ]+$
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式测试JavaScript:

/^[\u0600-\u06FF\uFB8A\u067E\u0686\u06AF7\u200C\u200F ]+$/.test('?????? ?? ?? ????????')
Run Code Online (Sandbox Code Playgroud)


Ima*_*adi 6

注意:persianRex是用Javascript编写的,但是你可以使用源代码并复制粘贴字符

由于键盘布局和操作系统的不同,检测波斯字符是一项棘手的任务.我曾经遇到过同样的挑战,我决定编写一个开源库来解决这个问题.

你可以解决这个问题:persianRex.text.test(yourInput); //返回true或false

这里是完整的文档:http: //imanmh.github.io/persianRex/