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
使用^[?????????????????????????????????]+$
的有关您正则表达式的味道(并非所有引擎都支持字母或使用代码点\uXXXX
表示法):
^[\u0622\u0627\u0628\u067E\u062A-\u062C\u0686\u062D-\u0632\u0698\u0633-\u063A\u0641\u0642\u06A9\u06AF\u0644-\u0648\u06CC]+$
Run Code Online (Sandbox Code Playgroud)使用^[??????????]+$
的数字或有关您正则表达式的味道:
^[\u06F0-\u06F9]+$
Run Code Online (Sandbox Code Playgroud)使用[ ?? ??? ?? ?? ?? ?? ?]
元音或有关您正则表达式的味道:
[\u202C\u064B\u064C\u064E-\u0652]
Run Code Online (Sandbox Code Playgroud)或这些在一起的组合.您可能还想在其他?
字符集中添加其他阿拉伯字母,如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查看它们.
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)
Mah*_*vej 12
除了接受的答案(/sf/answers/1579576351/)之外,我们还应该考虑Zero-width_non-joiner(或波斯语中的نیمفاصله)字符.不幸的是我们有2个符号.一个是标准的,另一个不是标准的,但广泛使用:
所以最终的 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)
注意:persianRex是用Javascript编写的,但是你可以使用源代码并复制粘贴字符
由于键盘布局和操作系统的不同,检测波斯字符是一项棘手的任务.我曾经遇到过同样的挑战,我决定编写一个开源库来解决这个问题.
你可以解决这个问题:persianRex.text.test(yourInput); //返回true或false
这里是完整的文档:http: //imanmh.github.io/persianRex/