NSS сканер после знака равенства
oauth_token=requestkey&oauth_token_secret=requestsecret
Как я могу использовать NSScanner, чтобы получить "requestkey" и "requestsecret". Я не могу этого достичь.
NSScanner* scanner = [NSScanner scannerWithString:string];
NSString *oauth_token = @"oauth_token=";
NSString *oauth_token_secret = @"oauth_token_secret=";
[scanner setCharactersToBeSkipped:nil];
NSString *token;
NSString *key;
while (![scanner isAtEnd]) {
[scanner scanString:oauth_token intoString:NULL];
[scanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"&"] intoString:&token];
[scanner scanUpToString:oauth_token_secret intoString:NULL];
[scanner scanUpToString:oauth_token intoString:&key];
NSLog(@"token%@", token);
NSLog(@"key %@", key);
//token requestkey
//key oauth_token_secret=requestsecret
}
Я не могу понять, почему это ноль. Спасибо!
1 ответ
Решение
Ничто не является нулевым. Так что я не могу говорить с этим.
Это на самом деле довольно прямая ошибка, если вы просто следуйте логике вашего кода построчно. Например:
[scanner scanString:oauth_token intoString:nil];
// The cursor is now just after the equals sign.
[scanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"&"] intoString:&token];
// This leaves the cursor just BEFORE the &.
[scanner scanUpToString:oauth_token_secret intoString:nil];
// This leaves the cursor just BEFORE the "oauth_token_secret="
[scanner scanUpToString:oauth_token intoString:&key];
// This scans effectively the rest of the string into &key which is in fact
// "oauth_token_secret=requestsecret"
Самый простой способ исправить это - использовать scanString:intoString:
метод для перемещения курсора до конца oauth_token_secret
,
[scanner scanString:oauth_token intoString:nil];
[scanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"&"] intoString:&token];
[scanner scanUpToString:oauth_token_secret intoString:nil];
// This leaves the cursor just BEFORE the "oauth_token_secret="
// **FIX HERE**
[scanner scanString:oauth_token_secret intoString:nil];
// The cursor is now AFTER oauth_token_secret.
[scanner scanUpToString:oauth_token intoString:&key];
Вывод журнала теперь показывает полезные строки.
token:requestkey
key :requestsecret
Но, как сказал H2CO3 в разделе комментариев, componentsSeparatedByString:
гораздо лучше подходит для этого варианта использования.