0

我试图从一些代码中提取一些字符串,但我遇到了一个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给我的数字?我该如何解决这个问题?

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

4

3 回答 3

1

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

"如果targetRangeHeadword.length记录为 27 并targetRangeHeadword.location记录为 2496,我怎样才能得到数字NSRangeException"

尝试targetRangeHeadword.location用 2400 之类的幻数替换NSLog它。难道2496就结束了stringToScan

-编辑:我刚刚注意到:

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

具体来说 ,表示未找到Range {2634, 2147481013}您的结束标签之一。</>

这个数字“2147481013”表示没有找到东西。

于 2014-06-28T05:32:34.530 回答
0

我会考虑在这里使用 NSRegularExpressions 和 rangeOfString 方法。这样,您可以获取特定模式的所有实例,并用您想要的任何内容替换它们或提取它们。练习这些的好网站在这里:www.regexr.com

于 2014-06-27T23:30:09.833 回答
0

startRangeHeadword未找到,它locationNSNotFound或可能是另一个搜索返回NSNotFound。您必须检查 NSRange 位置是否不在NSNotFound任何搜索 ( rangeOfString) 之后。错误检查很痛苦,但确实必须完成。

单步执行您的代码并观察(大量)的范围locationNSNotFound

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

于 2014-06-27T23:25:57.527 回答