检查NSString是否包含字母和数字

7
我正在寻找最佳方法来检查一个NSString是否包含数字和字母字符。目前我想到的代码如下,但这只是告诉我没有输入既不是数字也不是字母的字符。
if( [[myNSString stringByTrimmingCharactersInSet:
            [NSCharacterSet alphanumericCharacterSet]] isEqualToString:@""]){    
  //The string only contains alpha or numerical characters.
  //But now I want to check that both character sets are present ?    
}

我知道这样说可能有些异端,但最简单、最易懂、最高效的方法几乎肯定是通过循环遍历字符串,使用characterAtIndex提取每个字符,并将其与适当的边界进行比较。如果你想在6个月后理解代码,最好在其他方法中加上非常好的注释。 - Hot Licks
3个回答

14

只需截取letterCharacterSet和decimalDigitCharacterSet并检查生成的字符串是否与原始字符串不相等即可:

if (![[myOriginalString stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]] isEqualToString:myOriginalString] 
     && ![[myOriginalString stringByTrimmingCharactersInSet:[NSCharacterSet letterCharacterSet]] isEqualToString:myOriginalString]) {
...
}

谢谢你。是的,这就是我最终做的。 - ADude
检测程序中的一个错误:如果字符串包含控制字符,它会返回YES,这是错误的。 - jianpx

6

如果你的字符串开头或结尾是字母,而另一端是数字,kovpas的答案可以很好地工作。但是,如果数字嵌入在字母之间或反之亦然,比如'abc123abc',就会出现问题。这里有一个解决方案:

if (![[[str componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""] isEqualToString:str]  
    && ![[[str componentsSeparatedByCharactersInSet:[[NSCharacterSet letterCharacterSet] invertedSet]] componentsJoinedByString:@""] isEqualToString:str]) {  
    ....  
}

这个答案效果要好得多!不过我不确定为什么你要使用invertedSet。谢谢。 - Ezeki
这个问题的诀窍在于肯定判断更加复杂。第一个判断构建一个没有数字的字符串;如果该字符串与原始字符串相同,则字符串中没有数字。第二个判断对于字母也有类似的检查。这就是为什么两个条件都用了 NOT 的缘故。 - Amory
是的,但您不需要使用“invertedSet”,即使没有它,它也可以完美地工作。 - Ezeki

4
我不确定前两个答案是否涵盖了要求,因此这是一个针对更严格解释要求的答案。
根据原始帖子中的代码注释,我们可以得出以下要求:
//The string only contains alpha or numerical characters.   
//But now I want to check that both character sets are present?

这意味着通过测试的字符串必须仅由数字和字母组成,且至少包含一个数字和一个字母。

NSStringrangeOfCharacterFromSet: 方法可以查找字符串中是否包含某个字符集中的字符,因此我们可以使用它。

NSString *string = // ... string to test;

NSCharacterSet *illegalChars = [[NSCharacterSet alphanumericCharacterSet] invertedSet];

// Test if there is an illegal character in the string
BOOL hasIllegalCharacter = [string rangeOfCharacterFromSet: illegalCharacterSet].location != NSNotFound;

BOOL hasLetter = [string rangeOfCharacterFromSet: [NSCharacterSet letterCharacterSet]].location != NSNotFound;

BOOL hasDigit  = [string rangeOfCharacterFromSet: [NSCharacterSet decimalDigitCharacterSet]].location != NSNotFound;

if (hasDigit  && hasLetter  && !hasIllegalCharacter  ) {
    // String OK
}

如文档所述,rangeOfCharacterFromSet:在字符串中未找到集合中的任何字符时,会返回{NSNotFound, 0}的NSRange。这与Cocoa中搜索字符串或字符的其他方法类似。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接