substringWithRange超出界限 - 我错过了什么?

时间:2014-06-27 23:14:13

标签: ios objective-c nsrange nsrangeexception

我试图从某些代码中提取一些字符串,而且我遇到了NSRangeException我不明白的问题。这是我的代码:

NSString *start = @"<strong><span class='target'>";
NSString *end = @"</span></strong> ";

NSRange startRange = [stringToScan rangeOfString:start];
NSRange endRange = [stringToScan rangeOfString:end];
NSRange targetRange;
targetRange.length = endRange.location - startRange.location - startRange.length;
targetRange.location = startRange.location + startRange.length;
NSString *adlerNumber = [stringToScan substringWithRange:targetRange];
NSLog(@"%@",adlerNumber);

NSString *startHeadword = @"Translated headword: </strong>";
NSString *endHeadword = @"<strong class=";

NSRange startRangeHeadword = [stringToScan rangeOfString:startHeadword]; //logs as e.g. location 773, length 29
NSRange endRangeHeadword = [stringToScan rangeOfString:endHeadword]; //logs as e.g. location 809
NSRange targetRangeHeadword;
targetRangeHeadword.length = endRangeHeadword.location - startRangeHeadword.location - startRangeHeadword.length; //logs as e.g. 27
targetRangeHeadword.location = startRangeHeadword.location + startRangeHeadword.length; // logs as e.g. 2496
NSString *translatedHeadword = [stringToScan substringWithRange:targetRangeHeadword];

adlerNumber已创建并且日志没有错误。但是后来尝试创建translatedHeadword(上面的最后一行代码)给了我这个错误:

Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString substringWithRange:]: Range {2634, 2147481013} out of bounds; string length 9309'

如果targetRangeHeadword.length记录为27而targetRangeHeadword.location记录为2496,那么如何获取NSRangeException给我的数字?我该如何解决这个问题?

提前感谢您的帮助,伙伴和女孩们。

3 个答案:

答案 0 :(得分:0)

找不到

startRangeHeadwordlocationNSNotFound,或者可能是其他搜索返回NSNotFound。在任何搜索(NSNotFound)之后,您必须检查NSRange位置是否为rangeOfString。错误检查很痛苦,但确实必须这样做。

单步执行代码并观看location(大量)的范围NSNotFound

作为替代考虑NSScanner,它可能更适合您的需求。

答案 1 :(得分:0)

我会考虑在这里使用NSRegularExpressions并结合rangeOfString方法。这样,您可以获取特定模式的所有实例,并将其替换为您想要的任何内容或提取它们。这里有一个很好的练习场所:www.regexr.com

答案 2 :(得分:0)

添加一些NSLog以查看更多数字,例如stringToScan.length

如果targetRangeHeadword.length记录为27且targetRangeHeadword.location记录为2496,我如何才能将数字设为NSRangeException

尝试将targetRangeHeadword.location替换为幻数,例如2400和NSLog。可能是2496是stringToScan的结尾吗?

-EDIT:我刚注意到:

Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString substringWithRange:]: Range {2634, 2147481013} out of bounds; string length 9309'

具体 Range {2634, 2147481013},表示找不到您的结束标记之一</>

此号码“2147481013”表示未找到任何内容。