C# 只接受波斯语字符的正则表达式
我正在开发一个表单,其中一个自定义验证器应该只接受波斯语字符。我使用了以下代码:C# 只接受波斯语字符的正则表达式,c#,asp.net,regex,unicode,C#,Asp.net,Regex,Unicode,我正在开发一个表单,其中一个自定义验证器应该只接受波斯语字符。我使用了以下代码: var myregex=newregex(@“^[\u0600-\u06FF]+$”; if(myregex.IsMatch(mytextBox.Text)) { args.IsValid=true; } 其他的 { args.IsValid=false; } 然而,它似乎只能检测阿拉伯字符,因为它不能覆盖所有波斯字符(它缺少这四个字符:گ、چ、پ、ژ) 有办法解决这个问题吗?您当前的正则表达式中包含的是一个。对
var myregex=newregex(@“^[\u0600-\u06FF]+$”;
if(myregex.IsMatch(mytextBox.Text))
{
args.IsValid=true;
}
其他的
{
args.IsValid=false;
}
然而,它似乎只能检测阿拉伯字符,因为它不能覆盖所有波斯字符(它缺少这四个字符:گ、چ、پ、ژ)
有办法解决这个问题吗?您当前的正则表达式中包含的是一个。对于其他字符,您需要将它们单独添加到正则表达式中。以下是他们的代码:
ژ \u0698
پ \u067E
چ \u0686
گ \u06AF
所以总的来说你应该有
^[\u0600-\u06FF\u0698\u067E\u0686\u06AF]+$
波斯语、达里语和塔吉克语不在我的管辖范围内,但稍微翻阅一下Unicode代码表就会发现阿拉伯语包含5个Unicode代码块:
- 阿拉伯文:
- 阿拉伯文补编:
- 阿拉伯文扩展-A:
- 阿拉伯文演示文稿格式-A:
- 阿拉伯文演示文稿格式-B:
\p{IsArabicPresentationForms-A}
将为您提供前面列表中的第四个Unicode块
你也可以在Unicode中读取波斯计算:
除了接受的答案()之外,我们还应该考虑零宽度的非整数(或在波斯语中)。 不幸的是,我们有两个符号。一个是标准的,另一个不是标准的,但被广泛使用:
^[\u0600-\u06FF\uFB8A\u067E\u0686\u06AF\u200C\u200F]+$
如果你想考虑“<强>空间< /强>”,你可以使用这个:
^[\u0600-\u06FF\uFB8A\u067E\u0686\u06AF\u200C\u200F ]+$
您可以通过以下方式对其进行测试:
/^[\u0600-\u06FF\uFB8A\u067E\u0686\u06AF7\u200C\u200F ]+$/.test('ایپسر تو چه میدانی؟')
注意:persianRex是用Javascript编写的,但是您可以使用源代码并复制粘贴字符 由于键盘布局和操作系统的准确性,检测波斯字符是一项棘手的任务。我以前也遇到过同样的挑战,我决定写一个开源库来解决这个问题 您可以这样解决问题: persianRex.text.test(您的输入)//返回true或false 以下是完整的文档:
命名块,例如\p{Arabic}覆盖整个阿拉伯语脚本,而不仅仅是波斯字符 表示形式(u+FB50-u+FDFF)不应在文本中使用,而应转换为标准范围(u+0600-u+06FF) 为了仅涵盖波斯语,我们需要以下内容:
- 标准阿拉伯语范围之外的波斯语字符子集,即(U+0621-U+0624、U+0626-U+063A、U+0641-U+0642、U+0644-U+0648)
- 标准阿拉伯语发音符号(U+064B-U+0652)
- 另外两个变音符号(U+0654,U+0670)
- 四个额外的波斯语字符“گچپژ”(U+067E、U+0686、U+0698、U+06AF)
- U+06A9:波斯Kaf(正式名称为“阿拉伯字母Keheh”;与阿拉伯Kaf不同的符号)
- U+06CC:Farsi Yeh(与阿拉伯语Yeh不同的符号)
- U+200C:零宽度非连接件
^[\u0621-\u0624\u0626-\u063A\u0641-\u0642\u0644-\u0648\u064B-\u0652\u067E\u0686\u0698\u06AF\u06CC\u06A9\u0654\u670\u200c}]+$
另请参见此处列出的波斯语示例字符:
TL;博士
波斯语必须使用的字符集如下:
- 用于字母或使用有关正则表达式风格的代码点(并非所有引擎都支持
符号):\uxxx
- 用于数字或关于您的正则表达式风格:
^[\u06F0-\u06F9]+$
[\u202C\u064B\u064C\u064E-\u0652]
- 使用
[ٌ ًّ َ ِ ُ ْ ]代码>对于元音或关于您的正则表达式味道:
^[\u06F0-\u06F9]+$
[\u202C\u064B\u064C\u064E-\u0652]
ء
为什么[\u0600-\u06FF]
和[آ-ی]
都错了?
尽管\u0600-\u06FF
包括:
带码点گ
06AF
带码点چ
0686
带码点پ
067E
带码点ژ
0698
[\u0600-\u06FF]
或[آ-ی]
的答案都是错误的。
i、 e.\u0600-\u06FF
包含的字符比您需要的多!它还包含数字!
整个故事
这个答案的存在是为了修正一个常见的误解。代码点0600
到06FF
并不表示(也不表示[آ-ی]
):
255个字符归为(0600–06FF),波斯语字母表有32个字母,除了波斯语数字演示之外,还有42个字母。如果我们添加元音(最初在波斯语中很少使用的阿拉伯元音),而没有Tanvin(
,)代码>,ٌ代码>)和Tashdid(ّ代码>)这两个字母都是阿拉伯文而不是波斯语的一个子集,我们最终会有46个字符。这意味着\u0600-\u06FF
包含的字符比您需要的多209个
۷
带码点06F7
是数字的波斯语表示法7
和٧
带码点0667
是相同数字的阿拉伯语表示法。۶
是数字的波斯语表示法6
和٦
是相同数字的阿拉伯语表示法。所有这些数字都位于0600
到06FF
码点
波斯数字四(۴
),五(۵
)和六(۶
)的形状如下所示
与阿拉伯语中使用的形状不同,其他数字
不同的代码点
你可以看到波斯语/波斯语中不存在的其他不同数量的字符,在验证名字或姓氏时,没有人愿意使用它们
[آ-ی]
也包含117个字符,这远远超过了一个人需要的有效字符数
var encoding = Encoding.GetEncoding(1256);
var expect = "گ چ پ ژ";
var actual= encoding.GetBytes("گ چ پ ژ");
Assert.AreEqual(encoding.GetString(actual),expect);
if (is_numeric($mobile) && strlen($mobile) == 11) {
// if number in english
}else{
$mobile = str_split($mobile , 2);
if (count($mobile) != 11) {
return redirect()->back()->withErrors('فرمت شماره موبایل باید عدد و ۱۱ رقم باشد');
}
foreach ($mobile as $key => $number) {
if ($number == '۰') {
$mobile[$key] = 0;
}elseif ($number == '۱') {
$mobile[$key] = 1;
}elseif ($number == '۲') {
$mobile[$key] = 2;
}elseif ($number == '۳') {
$mobile[$key] = 3;
}elseif ($number == '۴') {
$mobile[$key] = 4;
}elseif ($number == '۵') {
$mobile[$key] = 5;
}elseif ($number == '۶') {
$mobile[$key] = 6;
}elseif ($number == '۷') {
$mobile[$key] = 7;
}elseif ($number == '۸') {
$mobile[$key] = 8;
}elseif ($number == '۹') {
$mobile[$key] = 9;
}
}
$mobile = implode($mobile);
if(is_numeric($mobile) == false){
return redirect()->back()->withErrors('فرمت شماره موبایل باید عدد و ۱۱ رقم باشد');
}
}