将NSString中的每个字符与字符集进行比较

时间:2012-12-14 17:53:08

标签: objective-c nsstring nscharacterset

我的目的是从文本字段中分析用户的输入,并检查他是否使用了任何符号。

例如,用户的输入是“/ ardv / * k”,我需要一个变量,表示用户输入了3个符号。

我不明白如何使用NSRange搜索字符串,因为它会在找到第一个匹配项后立即停止。

此外,NSSet与characterAtIndex选择器不兼容。

isEqualTo:没有用。

这就是我的所作所为,但我想知道如何在可能的情况下使这段代码更简单:

  ...
    NSString *testThisString = @"/ardv/*k";        
    NSCharacterSet *unknownFlags1 = [NSCharacterSet punctuationCharacterSet];
    NSCharacterSet *unknownFlags2 = [NSCharacterSet symbolCharacterSet];
    NSCharacterSet *unknownFlags3 = [NSCharacterSet whitespaceCharacterSet];

    int count = 0;
    for (int i = 0; i < [testThisString length]; i++) {
    if ([unknownFlags1 characterIsMember:[testThisString characterAtIndex:i]] |
   [unknownFlags2 characterIsMember:[testThisString characterAtIndex:i]] | 
   [unknownFlags3 characterIsMember:[testThisString characterAtIndex:i]]) {
        count++;
    }
}
    NSLog(@"There are %d unknowns", count);
  ...

3 个答案:

答案 0 :(得分:2)

要检查字符串是否包含属于某个集合的任何字符,您只需执行以下操作:

NSString *testString = @"hello$%^";
NSRange r = [testString rangeOfCharacterFromSet:[NSCharacterSet punctuationCharacterSet]];
if (r.location != NSNotFound) {
    // the string contains a punctuation character
}

如果您想知道标点字符的所有位置,只需继续使用不同的输入范围进行搜索。类似的东西:

NSRange searchRange = NSMakeRange(0, [testString length]);
while (searchRange.location != NSNotFound) {
    NSRange foundRange = [searchString rangeOrCharacterFromSet:[NSCharacterSet punctuationCharacterSet] options:0 range:searchRange];
    searchRange.location = foundRange.location + 1;
    searchRange.length = [testString length] - searchRange.location;
    if (foundRange.location != NSNotFound) {
        // found a character at foundRange.location
    }
}

答案 1 :(得分:0)

  

此外,NSSet与characterAtIndex选择器不兼容。

- (BOOL)characterIsMember:(unichar)aCharacter;
- (unichar)characterAtIndex:(NSUInteger)index;

他们都是unichar,所以你可以这样做。你做得很好。

答案 2 :(得分:0)

坦率地说,我只是循环遍历字符串的字符,单独检查每个字符,然后通过if-ladder或其他方式运行每个字符来检查您的“符号”。可能比使用任何kluge更快,例如rangeOfCharactersFromSet,并且更容易理解和维护。

提示:仅从字符串中提取一次字符,并将其置于unichar个临时值,而不是重复characterAtIndex次。更快更清晰。

此外,如果您正在处理的字符集是ASCII(即字符值为127或更小),您可以组成一个位或字节数组来指示每个字符的有效性。 (您甚至可以为更宽的字符执行此操作,但地图数组会变大。)不像NSCharacterSet那样优雅,但您可以将所有条件折叠到一个对象中。 (您也可以将所有条件折叠到一个NSCharacterSet中,但它需要提取位图并将它们“或”在一起。)