繁体   English   中英

C#特殊字符

[英]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类别用于字母:

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

请参阅支持的Unicode类别

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

实际上有数千个允许的字符可以合法地成为名称的一部分,分布在各种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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM