Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 只接受波斯语字符的正则表达式_C#_Asp.net_Regex_Unicode - Fatal编程技术网

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中读取波斯计算:

除了接受的答案()之外,我们还应该考虑零宽度的非整数(或在波斯语中)。 不幸的是,我们有两个符号。一个是标准的,另一个不是标准的,但被广泛使用:

  • \u200C:
  • \u200F:从右到左标记()
  • 因此,最终区域可以是:

    ^[\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:零宽度非连接件
    因此,生成的regexp将是:

    ^[\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]
      
    或者将这些字母组合在一起。您可能还需要在字符集中添加其他阿拉伯字母,如Hamza
    ء

    为什么
    [\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('فرمت شماره موبایل باید عدد و ۱۱ رقم باشد');
                }
            }