Я знаю, что прошло много лет с тех пор, как ответ был опубликован, но хотя код в ответе Яно технически верен, многократный вызов rangeOfString
неэффективен.
Регулярное выражение на самом деле довольно просто. Вы можете сделать одно из двух следующих действий:
key=([^&\s]+) // searches for the key
// matches all characters other than whitespace characters
// and ampersands
([^&?\s]+)=([^&\s]+) // searches for key/value pairs
// key matches all characters other than whitespace characters
// and ampersands and question marks
// value matches all characters other than whitespace characters
// and ampersands
Код в Objective-C с использованием NSRegularExpression
будет выглядеть так:
NSString *stringToSearch = @"?name=John&key=123%252Bf-34Fa"
NSError *error;
NSRegularExpression *findKey = [NSRegularExpression regularExpressionWithPattern:@"key=([^&\\s]+)" options:0 error:&error];
if (error) {
// log error
}
NSString *keyValue;
NSTextCheckingResult *match = [findKey firstMatchInString:stringToSearch options:0 range:NSMakeRange(0, stringToSearch.length)];
if (match) {
NSRange keyRange = [match rangeAtIndex:1];
keyValue = [stringToSearch substring:keyRange];
}
или как это:
NSString *stringToSearch = @"?name=John&key=123%252Bf-34Fa"
NSError *error;
NSRegularExpression *findParameters = [NSRegularExpression regularExpressionWithPattern:@"([^&?\\s]+)=([^&\\s]+)" options:0 error:&error];
if (error) {
// log error
}
NSMutableDictionary *keyValuePairs = [[NSMutableDictionary alloc] init];
NSArray *matches = [findParameters matchesInString:stringToSearch options:0 range:NSMakeRange(0, stringToSearch.length)];
for (NSTextCheckingResult *match in matches) {
NSRange keyNameRange = [match rangeAtIndex:1];
NSRange keyValueRange = [match rangeAtIndex:2];
keyValuePairs[[stringToSearch substring:keyNameRange]] = [stringToSearch substring:keyValueRange];
}
Обратите внимание на двойную обратную косую черту (\\), чтобы избежать обратной косой черты при использовании регулярного выражения в реальном коде.