用于特定语言的单词或名称的正则表达式

时间:2012-05-22 19:58:28

标签: c# .net regex internationalization

我对通过正则表达式的语言特定验证器感兴趣。我知道我可以用任何语言验证一个人的名字,其格式如下:

“[\p{L}\p{M}]”

但是,如果我希望验证是针对特定语言的呢?如果我的主题CurrentUICulture或CurrentCulture设置只是将"[\w]"的含义转换为适合德语,西班牙语,英语,尤其是中文的内容,那就太好了。这样做有用吗?如果是,那么这可能是我的答案。

如果没有,那么我的下一个兴趣是使用regex script annotation。但是,我注意到:

  1. 该链接中给出的列表不包括我特别感兴趣的简体“中文”。
  2. 我认为.NET正则表达式功能不支持基于脚本的匹配。是?否?
  3. 所以,如果我不能让前两个选项起作用,我的最后选择是转向named blocks。至少.net supported named blocks列表包括CJK的几个条目。我想我可以简单地组合几个CJK块,并称之为(简化)“中文”。

    思想?

1 个答案:

答案 0 :(得分:0)

我的结论是,在.net设置中,没有对CurrentUICulture敏感的正则表达式。我还得出结论,最宽松的合理方案是执行验证 - 同时适用于所有语言 - 只是拒绝所有形式的不可打印字符,“dingbats”,尖括号(以防止标记注入)和数学符号:

@”^[^\p{C}<>\p{Sm}\p{So}]*$”

中等宽容的方法是使用一个字符串,明确地捕获西方和东方字符集(包括变音符号和“组合字符”):

@"^[\p{L}\p{M}\p{Pd}\p{Pi}\p{Pf}\s]*$"

如果我只想要西方字符,最不宽容的方法就是:

@"^[\p{IsBasicLatin}\p{IsLatin-1Supplement}\p{Pd}\p{Pi}\p{Pf}-[\p{N}]]*$"

以上仍然允许所有形式的引号,通常适用于像O'Toole这样的名字。