2011-09-25 118 views
50

我有一个必须是唯一的A-Z,0-9和_检查的NSString包含字母数字+下划线只

如何检查,如果输入的是无效的字符串?我试过,但它接受信像A,A,O,O-等

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

回答

126

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

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

一旦你的,你把它颠倒的一切,这不是在原始字符串:

s = [s invertedSet]; 

然后你可以使用一个字符串方法来查找您的字符串是否包含任何倒置集合:

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

但是,如果用户希望在一个相当于加什么Z用另一种语言如中文? – Supertecnoboff

+0

@Supertecnoboff中文没有字母。也许你对日本的平假名和片假名感到困惑。或者你的意思是整个CJK统一表意文字,那就是80,388个:https://en.wikipedia.org/wiki/CJK_Unified_Ideographs –

+0

@Cœur我的观点是,你如何确保这个检查用户输入的数字只在ANY语言。这只是用英语来检查它。 – Supertecnoboff

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 
} 
4

创建你自己的字符集使用[NSCharacterSet characterSetWithCharactersInString:],然后像你一样修剪,看看返回的字符串是否有长度值。

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

35

您可以使用pred icate:

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

+0

谢谢。它为我工作 – Sakthimuthiah

+0

@Sinetris在myRegex末尾*做什么?这就像一个冠军!谢谢。 – Scooter

-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; 
} 
+0

此算法仅适用于包含单个大写字符的字符串。 – Pol

8

一些更简单的方法,

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例如:)

+0

这个问题明确给出了'alphanumericCharacterSet'的例子,因为它接受å,ä,ö,ø等不是所需的解决方案。 –

+2

这个答案现在很甜,现在我有糖尿病。 – GeneCode

1

复制在这里是你如何能做到这一点在斯威夫特(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 
    } 
} 
相关问题