检查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; }