.net Regular Expression可以匹配任何语言的任何类型的字母

时间:2010-06-01 12:52:54

标签: .net regex unicode asp.net-mvc-2 data-annotations

我可以使用哪种正则表达式来匹配(允许)来自任何语言的任何类型的字母

我需要匹配包括任何变音符号在内的任何字母(例如á,ü,ñ等) 并排除任何类型的符号(数学符号,货币符号,装饰符号,方框字符等)和标点字符。

我正在使用带有.net 4的asp.net MVC 2.我在我的视图模型中尝试过这个注释:

[RegularExpression(@"\p{L}*", ...

和这一个:

[RegularExpression(@"\p{L}\p{M}*", ...

但客户端验证不起作用。

更新 感谢您的所有答案,您的建议只适用于.net,这里的问题是它还使用正则表达式进行客户端验证(如果这还不够清楚,请对不起)。 我不得不去:

[^ 0-9_ \ |°¬#\ $%/ \()\¡¿+ {} []:?\; @ª^ *<> =&安培;] *

这是非常丑陋的,并不涵盖所有场景,但最接近我需要的东西。

8 个答案:

答案 0 :(得分:5)

忽略你的语法老师并使用双底片:

[^\W\d_]

请记住,\w匹配任何字母,数字或下划线,因此请将它们排除在上面。你可能会把它读作“不是一个字的字符,而不是一个数字,而不是一个下划线” - 只留下字母。应用DeMorgan的定理,它更有意义:“一个单词字符,但既不是数字也不是下划线。”

答案 1 :(得分:4)

您可以使用Char.IsLetter

  

指示指定的Unicode字符是否归类为Unicode字母。

使用.Net 4.0:

string onlyLetters = String.Concat(str.Where(Char.IsLetter));

在3.5 String.Concat上只有一个数组,所以你也应该调用ToArray

答案 2 :(得分:2)

你的问题更可能是你只需要一个 alpha-char,因为正则表达式将匹配至少有一个char的任何东西。

通过添加^作为前缀和$作为后缀,整个句子应符合您的正则表达式。所以这个问题有效:

^\p{L}*$

Regexbuddy解释说:

  1. ^断言字符串开头的位置
  2. \p{L}具有Unicode属性“letter”的字符(来自任何类型语言的任何类型的字母) 2A。在零和无限次之间,尽可能多(贪婪)
  3. $断言字符串末尾的位置

答案 3 :(得分:1)

\p{L}*应匹配“任何语言的任何类型的信件”。它应该工作,我在.NET中的i18n-proof uppercase/lowercase recognition regex中使用它。

答案 4 :(得分:1)

需要注意的一点是客户端正则表达式。它在客户端使用javascript正则表达式,在服务器端使用.net正则表达式。 Javascript不支持此方案。

答案 5 :(得分:1)

我只需要验证一个URL,然后在.NET中选择了这个正则表达式。

^[(\p{L})?(\p{M})?-]*$

以任何语言的字符开头和结尾(可选择字母或标记)并允许连字符。

答案 6 :(得分:0)

\ w - 匹配任何字母数字字符(包括数字)

在我的测试中它符合:

  • A
  • A
  • C
  • 8
  • ž

并且未匹配:

  • \

如果您确切地知道要排除的内容(如小清单),请执行以下操作:

[^;,\`]

一次匹配任何不符合的字符:

  • \
  • `

希望它有所帮助!

答案 7 :(得分:0)

将正则表达式选项设置为无贪婪(懒惰)。

/\p{L}/u