0

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

例如,用户的输入是“/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);
  ...
4

3 回答 3

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
    }
}
于 2012-12-14T18:09:52.227 回答
0

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

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

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

于 2012-12-14T18:09:02.493 回答
0

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

提示:仅从字符串中提取字符一次,并将其放入unichar临时文件中,而不是重复characterAtIndex多次。更快更清晰。

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

于 2012-12-14T18:21:50.360 回答