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

时间:2011-09-25 14:44:55

标签: ios objective-c

我有一个字符串,只需要a-z,0-9和_

如何检查输入是否有效?我试过了,但它接受了像å,ä,ö,ø等的信。

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

7 个答案:

答案 0 :(得分:129)

您可以创建自己的字符集:

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

完成后,将其反转为原始字符串中的所有内容:

s = [s invertedSet];

然后你可以使用字符串方法来查找你的字符串是否包含反转集中的任何内容:

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

答案 1 :(得分:36)

您可以使用谓词:

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

答案 2 :(得分:9)

更简单的方法,

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

它会结合使用字母数字和下划线。你可以像使用它一样使用

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

PS。从@DaveDeLong示例中复制的示例:)

答案 3 :(得分:4)

使用[NSCharacterSet characterSetWithCharactersInString:]创建自己的字符集,然后在修改时查看返回的字符串是否具有长度值。

或者您可以使用invertedSet删除所有未设置的字符,如果这有助于生成已清理的字符串。

答案 4 :(得分:3)

您可以循环遍历字符串中的每个字符,并检查它是否为字母数字:

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
}

答案 5 :(得分:2)

以下是如何在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
    }
}

答案 6 :(得分:-1)

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

-(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;
}