我需要验证一个字符串不包含任何特殊字符,如#,%...™等。基本上它是一个名字/姓氏(和一些类似的)字符串,但是,坚持[a-zA-Z ]不会像ščřž那样的符号......是允许的。
此刻我有点像
bool NonSpecial(string text){
return !Regex.Match(Regex.Escape("!#@$%^&......")).Success;
}
但这似乎太复杂和笨拙。
有更简单和/或更优雅的方式吗?
更新 所以在阅读完所有回复之后我决定选择
private bool IsName( string text ) {
return Regex.Match( text, @"^[\p{L}\p{Nd}'\.\- ]+$" ).Success && !Regex.Match( text, @"['\-\.]{2}" ).Success && !Regex.Match( text, " " ).Success;
}
基本上,名称可以包含字母,数字,',。, - 和空格,任何“,.-”必须由至少1个其他允许的字符分隔,并且连续不能有2个空格。< / p>
希望这是正确的。
答案 0 :(得分:4)
您是否尝试过text.All(Char.IsLetter)
?
PS http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/
答案 1 :(得分:2)
答案 2 :(得分:1)
这个问题比你想象的要糟糕。
有数千个允许的字符可以合法地成为名称的一部分,分布在各种unicode字母表中的数百个范围内。
还有成千上万的字符永远不会成为名字的一部分。想想所有的表情符号和ascii艺术角色。这些也分布在数百个单独的unicode字符范围内。
通过手动代码,甚至正则表达式从谷壳中筛选小麦,效果不佳。
谢天谢地,这项工作已经完成了。查看char.IsLetter()
方法。
您可能还希望各种允许的分隔符和重音符号不是字母,但可以是名称的一部分:连字符,撇号和句点是合法的,并且都具有多个允许的unicode编码。不幸的是,我这里没有快速解决方案。这可能需要采取尽力而为的方法,只考虑一些更常见的方法。
答案 3 :(得分:0)
尝试使用Linq / Lambda以及非常直接的
如果不包含字母
,将返回true
bool result = text.Any(x => !char.IsLetter(x));