检查NSString是否仅包含字母数字+下划线字符

我有一个string,只需要az,0-9和_

如何检查input是否有效? 我已经试过了,但它接受像å,ä,ö,ø等字母

NSString *string = [NSString stringWithString:nameField.text]; NSCharacterSet *alphaSet = [NSCharacterSet alphanumericCharacterSet]; [string stringByTrimmingCharactersInSet:alphaSet]; [string stringByReplacingOccurrencesOfString:@"_" withString:@""]; BOOL valid = [[string stringByTrimmingCharactersInSet:alphaSet] isEqualToString:@""]; 

你可以创build你自己的字符集:

 NSCharacterSet *s = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"]; 

一旦你有了,就把它反转为不在原始string中的所有东西:

 s = [s invertedSet]; 

然后你可以使用一个string方法来查找你的string是否包含倒置集合中的任何内容:

 NSRange r = [string rangeOfCharacterFromSet:s]; if (r.location != NSNotFound) { NSLog(@"the string contains illegal characters"); } 

你可以使用谓词:

 NSString *myRegex = @"[A-Z0-9a-z_]*"; NSPredicate *myTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", myRegex]; NSString *string = nameField.text; BOOL valid = [myTest evaluateWithObject:string]; 

编辑:我没有注意到你正在使用[NSString stringWithString:nameField.text]

改用nameField.text

一些更简单的方法,

 NSMutableCharacterSet *allowedSet = [NSMutableCharacterSet characterSetWithCharactersInString:@"_"]; [allowedSet formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]]; NSCharacterSet *forbiddenSet = [allowedSet invertedSet]; 

它将结合字母数字和_underscore。

你可以使用它,

 NSRange r = [string rangeOfCharacterFromSet:forbiddenSet]; if (r.location != NSNotFound) { NSLog(@"the string contains illegal characters"); } 

PS。 从@DaveDeLong例子复制的例子:)

使用[NSCharacterSet characterSetWithCharactersInString:]创build自己的字符集,然后像您一样修剪,以查看返回的string是否具有长度值。

或者你可以使用invertedSet删除所有非设置的字符,如果这将有助于产生一个干净的string。

您可以遍历string中的每个字符并检查它是否是字母数字:

 BOOL isMatch = YES; for (int i = 0; i < [string length]; i++) { unichar c = [string characterAtIndex:i]; if (!isalnum(c) && c != '_') { isMatch = NO; break; } } if (isMatch) { // valid } else { // invalid } 

下面是你如何在Swift中完成它(作为String类的扩展):

 extension String { func containsValidCharacters() -> Bool { var charSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_") charSet = charSet.invertedSet let range = (self as NSString).rangeOfCharacterFromSet(charSet) if range.location != NSNotFound { return false } return true } } 

如果有帮助,这是一个快速的帮手

 -(BOOL)isString:(NSString *)s{ char letter = 'A'; //BOOL isLetter=NO; for (int i=0; i<26; i++) { NSString *temp = [NSString stringWithFormat:@"%c",letter+i]; if ([s isEqualToString:temp]) { return YES; } } return NO; }