如何验证一个字符串只允许包含字母和数字字符?
问题的出现的原因是需要验证一个字符串是否只包含字母和数字的字符。解决方法是使用.NET 4.0中的LINQ功能来实现验证。
在.NET 4.0中,可以使用LINQ来验证字符串是否只包含字母和数字的字符。可以使用yourText.All(char.IsLetterOrDigit)
来实现。这个方法会在char.IsLetterOrDigit
返回false
时立即停止执行并返回false
,因为All
方法的约定无法满足。
需要注意的是,这个答案不严格检查只包含字母和数字的字符(通常是A-Z,a-z和0-9)。这个答案允许包含本地字符,比如åäö
。
更新于2018-01-29:
上面的语法只适用于使用具有正确类型(在这种情况下为char
)的单个参数的单个方法。如果需要使用多个条件,可以按照以下方式编写代码:if (yourText.All(x => char.IsLetterOrDigit(x) || char.IsWhiteSpace(x)))
。
相比于正则表达式,这种方法的性能如何?我认为这种方法的速度应该与正则表达式一样快,甚至更快。没有需要编译或评估的正则表达式,只需要进行简单的比较。
如果要确保yourText
只包含字母和数字,这种方法会失败吗?它可能既全是数字又全是字母,但仍然满足这个条件。是的,但这不是问题的要求。
我认为这个答案是错误的,因为它假设字母和数字字符集是A-Z,a-z和0-9,而实际上它包括了整个Unicode字母和数字范围,其中包括了非拉丁字符。例如,char.IsLetterOrDigit('ก')
会返回true
。
你是否认为stackoverflow上的所有答案都对所有读者都正确?或者你是说问问题的人总是明确定义问题而没有歧义?我的意思是,许多人使用这个答案是因为他们希望允许本地字母。如果不是这样,他们会选择被接受的答案。然而,你的观点是正确的,我已经更新了答案以澄清这一点,谢谢!
有没有办法同时包含空格?可以使用char.IsWhiteSpace
来实现。所以我们可以使用多个条件(AND
或OR
)来编写代码:yourText.All(x => char.IsLetterOrDigit(x) || char.IsWhiteSpace(x))
。简写形式(就像答案中的形式)只适用于单个方法调用。
如何验证一个字符串只允许包含字母数字字符?
有人问到如何验证一个字符串只允许包含字母数字字符。下面是一种解决方法,可以使用一个扩展函数来实现,而不是使用正则表达式。
public static bool IsAlphaNum(this string str) { if (string.IsNullOrEmpty(str)) return false; for (int i = 0; i < str.Length; i++) { if (!(char.IsLetter(str[i])) && (!(char.IsNumber(str[i])))) return false; } return true; }
另一个解决方法如下:
public static bool IsAlphaNum(this string str) { if (string.IsNullOrEmpty(str)) return false; return (str.ToCharArray().All(c => Char.IsLetter(c) || Char.IsNumber(c))); }
某些情况下可以使用foreach循环来代替for循环。对于空字符串是否被认为是合法的,取决于具体的应用场景,所以可以根据需要进行调整。此外,对于这样一个简单的函数,我个人不会在代码中添加6个空行,但这可能是C#/Java/C++的编码风格,可能是因为这些编程语言的开发者是按屏幕空间计费的。总之,这个解决方法是正确的方向,值得赞扬。
有人建议在这种情况下使用IsDigit而不是IsNumber,因为IsNumber对于看起来像数字的字符(如分数、罗马数字等)也会返回true。基于这个建议,我们可以进一步简化IsAlphaNum函数的代码:
return string.IsNullOrEmpty(str) ? false : str.ToCharArray().All(Char.IsLetterOrDigit);
需要注意的是,Char.IsLetter不仅仅返回a-zA-Z的字母,还包括其他Unicode字符,如日文的あ、中文的的、韩文的한等。如果你的意图是允许这些字符作为字母数字字符,那么可以保留这段代码。但从其他答案中的正则表达式可以看出,大多数人认为这些字符不属于字母数字字符。
如果你的需求还包括判断是否有空格字符,那么可以在代码中添加Char.IsWhiteSpace的判断。
要验证一个字符串只包含字母数字字符,可以使用扩展函数和循环来对字符串进行逐个字符的判断,也可以利用LINQ的All函数来简化代码。此外,根据具体需求,还可以添加其他判断条件,如是否允许空字符串或空格字符。
问题的出现原因:
在编程中,有时需要对字符串进行验证,确保其中只包含字母和数字字符。这可能是为了安全性考虑,避免恶意输入造成的问题,或者为了满足特定的业务需求。然而,对于不熟悉正则表达式的开发者来说,编写验证字符串的规则可能会比较困难,容易出错。
解决方法:
一种常见的解决方法是使用正则表达式来验证字符串。正则表达式是一种用于匹配和查找字符串模式的工具,可以用来检查字符串是否符合特定的规则。对于只允许包含字母和数字字符的字符串,可以使用以下正则表达式进行验证:
^[a-zA-Z0-9]*$
在C#中,可以使用System.Text.RegularExpressions命名空间中的Regex类来实现这个验证。具体代码如下:
using System.Text.RegularExpressions; Regex r = new Regex("^[a-zA-Z0-9]*$"); if (r.IsMatch(SomeString)) { ... }
在JavaScript中,也可以使用类似的方法进行验证,代码如下:
var regex = /^[a-zA-Z0-9]*$/; if (regex.test(someString)) { ... }
需要注意的是,以上代码中的正则表达式只允许空字符串通过验证。如果要求字符串至少包含一个字符,可以将正则表达式中的*
替换为+
,即^[a-zA-Z0-9]+$
。
尽管有人对正则表达式表示厌恶,觉得很难记住其语法,但是正则表达式在编程中的应用十分广泛,经常被用于字符串验证、搜索替换等操作。掌握正则表达式的使用,将会让编程工作更加高效和便捷。