[英]C# special characters
我需要验证一个字符串是否不包含任何特殊字符,例如#,%...™等。基本上,它是一个名称/姓氏(和一些类似的)字符串,但是,坚持使用[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个空格。
希望这是对的。
您是否尝试过text.All(Char.IsLetter)
吗?
PS http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/
这个问题比你想象的还要糟糕。
实际上有数千个允许的字符可以合法地成为名称的一部分,分布在各种unicode字母表中的数百个范围内。
还有成千上万的字符永远不会成为名称的一部分。 想想所有的表情符号和ascii艺术角色。 这些也分布在数百个不同范围的unicode字符中。
通过手动代码,甚至是正则表达式来筛选谷壳中的小麦,效果不佳。
幸运的是,这项工作已经为您完成。 查看char.IsLetter()
方法。
您可能还希望对各种允许的分隔符和重音(不是字母,但是可以是名称)进行例外处理:连字符,撇号和句点是合法的,并且都具有多个允许的unicode编码。 不幸的是,我这里没有快速解决方案。 这可能需要尽力而为,只考虑一些更常见的方法。
尝试使用Linq / Lambda以及非常简单的方法
如果它不包含字母,则返回true
bool result = text.Any(x => !char.IsLetter(x));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.