我有字符串@" ILL WILL KILLS "
,我正在使用NSScanner的scanUpToString:intoString:
来查找每次出现的“ILL”。如果它准确,它将NSLog
4,9和14。
我的字符串以4个空格开头,我意识到它们是NSScanner的默认charactersToBeSkipped
NSCharacterSet的成员。如果我将charactersToBeSkipped
设置为nil
,如下例所示,则此代码会准确找到3次出现的“ILL”。
NSScanner* scanner = [NSScanner scannerWithString:@" ILL WILL KILLS "] ;
scanner.charactersToBeSkipped = nil ;
NSString* scannedCharacters ;
while ( TRUE ) {
BOOL didScanUnignoredCharacters = [scanner scanUpToString:@"ILL" intoString:&scannedCharacters] ;
if ( scanner.isAtEnd ) {
break ;
}
NSLog(@"Found match at index: %tu", scanner.scanLocation) ;
// Since stopString "ILL" is 3 characters long, advance scanLocation by 3 to find the next "ILL".
scanner.scanLocation += 3 ;
}
但是,如果我没有取消默认的charactersToBeSkipped
,那么会发生以下情况:
scanner
初始化为scanLocation == 0
。scanUpToString
第一次执行,它“看过去”4个空格并在索引4处“看到”ILL
,因此它会立即停止。 scanLocation
仍为0
。scanLocation
增加了3。scanUpToString
第二次执行,它“看起来超过”1个空格并在索引4处“看到”ILL
,因此它会立即停止。 scanLocation
仍为3
。对我来说,这是scanner
第一次在scanLocation == 0
停止的设计缺陷,因为我预计它会停留在scanLocation == 4
。如果您认为上述代码可以准确NSLog
4,9和14而不设置charactersToBeSkipped
到nil
,那么请,请告诉我如何。目前,我认为charactersToBeSkipped
仅仅是为了使NSScanner更难以使用。
答案 0 :(得分:0)
目前,我认为
charactersToBeSkipped
仅仅是为了让NSScanner
更难以使用。
然后你不是很有想象力。 charactersToBeSkipped
的“好处”是......等待它......跳过字符。例如,如果您有一个类似@" 8 9 10 "
的字符串,则可以使用-scanInt:
三次扫描这三个整数。您不必关心分隔它们的精确空白量。
根据您描述的任务,您只是在字符串中查找字符串的实例,NSScanner
可能不是正确的工具。您可能想要使用-[NSString rangeOfString:options:range:]
。
-scanUpToString:intoString:
的文档相当清楚。如果stopString
是接收者中的第一个字符串(考虑到将跳过charactersToBeSkipped
),则该方法返回NO
,这意味着它不会扫描任何内容。因此,扫描位置不会改变。
返回值表示成功或失败。如果停止字符串是下一个(忽略要跳过的字符),则没有任何内容可以扫描“直到”停止字符串;扫描仪已经处于停止字符串,因此方法失败。