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

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

然而,它似乎只能检测阿拉伯字符,因为它不能覆盖所有波斯字符(它缺少这四个字符:گ、چ、پ、ژ).

有办法解决这个问题吗?

推荐答案

TL;DR

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

  • 使用^[آابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی]+$表示字母或使用与您的regex风格相关的代码点(并非所有引擎都支持\uXXXX表示法):

    ^[\u0622\u0627\u0628\u067E\u062A-\u062C\u0686\u062D-\u0632\u0698\u0633-\u063A\u0641\u0642\u06A9\u06AF\u0644-\u0648\u06CC]+$
    
  • 使用^[۰۱۲۳۴۵۶۷۸۹]+$表示数字或关于你的正则表达式风格:

    ^[\u06F0-\u06F9]+$
    
  • 元音使用[ ‬ٌ ‬ًّ ‬َ ‬ِ ‬ُ ‬ْ ‬],或者与你的正则表达式风格有关:

    [\u202C\u064B\u064C\u064E-\u0652]
    

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

Why are [\u0600-\u06FF] and [آ-ی] both wrong?

Although \u0600-\u06FF includes:

  • گ和代码点06AF
  • چ和代码点0686
  • پ,具有码点067E
  • ژ和代码点0698

as well, all answers that suggest [\u0600-\u06FF] or [آ-ی] are simply WRONG.

i.e. \u0600-\u06FF contains 209 more characters than you need! and it includes numbers too!

enter image description here

Whole story

这个答案的存在是为了修正一个常见的误解.代码点060006FF不表示100([آ-ی]也不表示):

[\u0600-\u0605 ؐ-ؚ\u061Cـ ۖ-\u06DD ۟-ۤ ۧ ۨ ۪-ۭ ً-ٕ ٟ ٖ-ٞ ٰ ، ؍ ٫ ٬ ؛ ؞ ؟ ۔ ٭ ٪ ؉ ؊ ؈ ؎ ؏
۞ ۩ ؆ ؇ ؋ ٠۰ ١۱ ٢۲ ٣۳ ٤۴ ٥۵ ٦۶ ٧۷ ٨۸ ٩۹ ءٴ۽ آ أ ٲ ٱ ؤ إ ٳ ئ ا ٵ ٮ ب ٻ پ ڀ
ة-ث ٹ ٺ ټ ٽ ٿ ج ڃ ڄ چ ڿ ڇ ح خ ځ ڂ څ د ذ ڈ-ڐ ۮ ر ز ڑ-ڙ ۯ س ش ښ-ڜ ۺ ص ض ڝ ڞ
ۻ ط ظ ڟ ع غ ڠ ۼ ف ڡ-ڦ ٯ ق ڧ ڨ ك ک-ڴ ػ ؼ ل ڵ-ڸ م۾ ن ں-ڽ ڹ ه ھ ہ-ۃ ۿ ەۀ وۥ ٶ
ۄ-ۇ ٷ ۈ-ۋ ۏ ى يۦ ٸ ی-ێ ې ۑ ؽ-ؿ ؠ ے ۓ \u061D]

255个字符在Arabic block以下(0600–06FF),波斯语字母表有32个字母,除波斯语数字演示外,还有42个字母.如果我们在没有Tanvin(ًٍِ ‬ٌ ‬)和Tashdid(ّ ‬)的情况下添加元音(最初是阿拉伯语元音,很少在波斯语中使用),而这两个元音都是阿拉伯变音符号的子集,而不是波斯语,那么我们将得到46个字符.这意味着\u0600-\u06FF包含的字符比您需要的多209个!

具有码点06F7۷是数字7的波斯语表示,具有码点0667٧是相同数字的阿拉伯语表示.۶是数字6的波斯语表示,٦是相同数字的阿拉伯表示.并且全部驻留在060006FF个码点中.

波斯数字四(۴)、五(۵)和六(۶)的形状为 与阿拉伯语中使用的形状不同,其他数字具有 不同的代码点.

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

[آ-ی]还包含117个字符,这远远超过了验证所需的字符数.你可以通过100看到它们.

Asp.net相关问答推荐

是否可以发布 ASP.NET 5 应用程序以使目标机器不需要安装 DNX?

在正则表达式中允许 -(破折号)

HttpResponse 的区别:SetCookie、AppendCookie、Cookies.Add

是否可以使用 Membership API 更改用户名

SameSite 属性如何自动添加到我的 Asp.net_SessionID cookie 中?

IIS 6/ASP.NET Windows 身份验证 list ?

如何在页面的基类中执行 Page_Load()?

无法加载文件或程序集'System.Web.WebPages.Razor,版本 = 3.0.0.0

N' 在 SQL 脚本中代表什么? (插入脚本中字符之前使用的那个)

是否有用于 Asp.net 标记的#IF DEBUG?

与将 Web 应用程序保存在一个默认应用程序池中相比,拥有专用应用程序池的优缺点

无法复制文件.访问路径被拒绝

在 asp.net 中将 JSON 转换为 .Net 对象时出错

将 Http 请求读入字节数组

InvalidOperationException:无法为角色创建 DbSet,因为此类型未包含在上下文模型中

VS 2010 中缺少 App_Code 文件夹

如何在 .NET Core 中实现 DbContext 连接字符串?

压力测试 ASP.Net 应用程序

为在 ASP.NET Web API 中使用 User.Identity.Name 的方法编写单元测试

Request.UserHostAddress 和 Request.ServerVariables["REMOTE_ADDR"].ToString() 有什么区别