我需要验证表单'name'字段,其中可能包含带有重音符号的字符,例如á,é等。
我尝试在另一个SO问题中指示在以下属性中应用正则表达式(道歉我现在找不到),并且正确地验证了我不想要的大多数字符(即*,^, ?)它也将重音字符标记为无效。
这是因为我在客户端验证而不是服务器吗?
任何建议都将受到赞赏。
[ValidateRegExp(@"^\w*$", "Invalid characters in surname")]
答案 0 :(得分:9)
我不会给你正则表达式,因为你真的不应该验证人的名字 这是容易出错的之一,offend your users 。
无论如何,这有什么好处?
你可能做的最粗鲁的事情是说类似于“姓氏中的无效字符”。我的姓是Абрамов,字符完全有效,只是你的系统不够智能。用户界面不应该因你的错误而责怪我。
如果接受此类字符确实会破坏您的数据库,请至少回复“我们非常抱歉,但我们的系统不接受任何英文字母。”
通过Patrick看看这篇精彩的帖子:
- 人们只有一个规范的全名。
- 人们只有一个全名。
- 此时,人们只有一个规范的全名。
- 在这个时间点,人们有一个他们经过的全名。
- 对于任何N值,人们都有N个名字。
- 人们的名字符合一定数量的空间。
- 人们的名字不会改变。
- 人们的名字会发生变化,但仅限于某些枚举事件。
- 人们的名字是用ASCII编写的。
- 人们的名字是用任何单个字符集编写的。
- 人们的名字都映射在Unicode代码点中。
- 人们的名字区分大小写。
- 人们的名字不区分大小写。
- 人们的名字有时会有前缀或后缀,但你可以放心地忽略它们。
- 人名不包含数字。
- 人们的名字不是全部大写的。
- 人们的姓名不是全部用小写字母书写的。
- 人们的名字是他们的命令。选择任何排序方案将自动导致所有系统之间的一致排序,只要两者对同一名称使用相同的排序方案即可。
- 人们的名字和姓氏必然是不同的。
- 人们有姓氏,姓氏,或其他被公认为亲属的人分享的名字。
- 人们的名字是全球唯一的。
- 人们的名字几乎是全球唯一的。
- 好吧,但是人们的名字肯定是多种多样的,以至于没有一百万人拥有相同的名字。
- 我的系统永远不会处理来自中国的名字。
- 或日本。
- 或韩国。
- 或爱尔兰,英国,美国,西班牙,墨西哥,巴西,秘鲁,俄罗斯,瑞典,博茨瓦纳,南非,特立尼达,海地,法国或克林贡帝国,所有这些都有“奇怪”的命名常用方案。
- 克林贡帝国的事情是个玩笑,对吗?
- 混淆你的文化相对主义!至少,我的社会中的人们同意一个普遍接受的名称标准。
- 存在一种转换名称并且可以无损地反转的算法。 (是的,是的,如果你的算法返回输入,你可以这样做。你得到一颗金星。)
- 我可以放心地假设这个坏词词典里面没有人的名字。
- 人们的名字是在出生时分配的。
- 好吧,也许不是在出生时,但至少非常接近出生。
- 好的,好的,在出生后的一年左右。
- 五年?
- 你在跟我开玩笑吧?
- 包含同一个人数据的两个不同系统将使用该人员的相同名称。
- 如果系统设计良好,两个不同的数据输入操作符(根据人名)必须在任何单个系统上输入按位等效字符串。
- 名字破坏我的系统的人是奇怪的异常值。他们应该拥有坚实,可接受的名字,比如田中太郎。
- 人们有名字。
醇>
答案 1 :(得分:3)
\p{L}
或\p{Letter}
=识别为字母的任何unicode字符。\p{N}
或\p{Number}
=任何识别为数字的unicode字符。更多变种:http://www.regular-expressions.info/unicode.html#prop
[ValidateRegExp(@"^[\p{L}\p{N}]*$", "Disallowed characters in surname")]
答案 2 :(得分:0)
尝试使用此字符集:[a-zA-ZÀ-ÿ0-9]
。第三个范围将匹配所有重音字符。
[ValidateRegExp(@"^[a-zA-ZÀ-ÿ0-9]*$", "Invalid characters in surname")]
答案 3 :(得分:0)
如何完全避免正则表达式并使用类似的东西:
s.All(c=>char.IsLetter(c))
您还应该先normalize the string。因此,您可以处理重音字符,基本字符和重音位于不同的char
s。