Подтвердить что ты не робот

Извлечение строки подстрокойWithRange: дает "индекс за пределами границ"

Когда я пытаюсь извлечь строку из более крупной строки, она дает мне ошибку диапазона или индекса за пределами границ. Я мог бы игнорировать что-то действительно очевидное здесь. Спасибо.

NSString *title = [TBXML textForElement:title1];
TBXMLElement * description1 = [TBXML childElementNamed:@"description" parentElement:item1];
NSString *description = [TBXML textForElement:description1];
NSMutableString *des1 = [NSMutableString stringWithString:description];

//search for <pre> tag for its location in the string
NSRange match;
NSRange match1;
match = [des1 rangeOfString: @"<pre>"];
match1 = [des1 rangeOfString: @"</pre>"];
NSLog(@"%i,%i",match.location,match1.location);
NSString *newDes = [des1 substringWithRange: NSMakeRange (match.location+5, match1.location-1)]; //<---This is the line causing the error

NSLog(@"title=%@",title);
NSLog(@"description=%@",newDes);

ОБНОВЛЕНИЕ: Вторая часть диапазона - это длина, а не конечная точка. D'о!

4b9b3361

Ответ 1

Второй параметр, переданный в NSMakeRange, не является конечным местоположением, это длина диапазона.

Таким образом, приведенный выше код пытается найти подстроку, начинающуюся с первого символа после <pre> и заканчивая после этого N символов, где N является индексом последнего символа перед целой строкой.

Пример: в строке "wholeString<pre>test</pre>noMore" ", первый 't' of 'test' имеет индекс 16 (первый символ имеет индекс 0), и конечный 't' of 'test' имеет, следовательно, индекс 19. Вышеупомянутый код вызывал бы NSMakeRange(16, 19), что включают 19 символов, начиная с первого 't' 'теста'. Но из первого 't' теста 'до конца строки всего 15 символов включительно, поэтому вы получаете за пределами исключение.

Вам нужно вызвать NSRange с соответствующей длиной. Для вышеуказанной цели это было бы NSMakeRange(match.location+5, match1.location - (match.location+5))

Ответ 2

Попробуйте это

NSString *string = @"www.google.com/api/123456?google/apple/document1234/";
//divide the above string into two parts. 1st string contain 32 characters and remaining in 2nd string
NSString *string1 = [string substringWithRange:NSMakeRange(0, 32)];
NSString *string2 = [string substringWithRange:NSMakeRange(32, [string length]-[string1 length])];
NSLog(@"string 1 = %@", string1);
NSLog(@"string 2 = %@", string2);

В строке2 я вычисляю индекс последнего символа

Выход:

string 1 = www.google.com/api/123456?google
string 2 = /apple/document1234/