C#特殊字符

时间:2014-08-13 20:30:41

标签: 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个空格。< / p>

希望这是正确的。

4 个答案:

答案 0 :(得分:4)

答案 1 :(得分:2)

您可以将Unicode类别用于字母:

Regex.Match(text, @"\p{L}+");

请参阅Supported Unicode Categories

答案 2 :(得分:1)

这个问题比你想象的要糟糕。

有数千个允许的字符可以合法地成为名称的一部分,分布在各种unicode字母表中的数百个范围内。

还有成千上万的字符永远不会成为名字的一部分。想想所有的表情符号和ascii艺术角色。这些也分布在数百个单独的unicode字符范围内。

通过手动代码,甚至正则表达式从谷壳中筛选小麦,效果不佳。

谢天谢地,这项工作已经完成了。查看char.IsLetter()方法。

您可能还希望各种允许的分隔符和重音符号不是字母,但可以是名称的一部分:连字符,撇号和句点是合法的,并且都具有多个允许的unicode编码。不幸的是,我这里没有快速解决方案。这可能需要采取尽力而为的方法,只考虑一些更常见的方法。

答案 3 :(得分:0)

尝试使用Linq / Lambda以及非常直接的

  如果

不包含字母

将返回true

bool result = text.Any(x => !char.IsLetter(x));