我的目的是从文本字段中分析用户的输入,并检查他是否使用了任何符号。
例如,用户的输入是“/ 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);
...
答案 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中,但它需要提取位图并将它们“或”在一起。)