Якщо я хочу отримати значення з NSString @"value:hello World:value", що я повинен використовувати?
Повернене значення, яке я хочу, це @"hello World".
Якщо я хочу отримати значення з NSString @"value:hello World:value", що я повинен використовувати?
Повернене значення, яке я хочу, це @"hello World".
"hello World"? return @"hello World". Ви хочете повернути лише те, що між двокрапками? Ви хочете зачистити все ліве від самої лівої товстої кишки і все право від самої правої товстої кишки? Для цього питання немає чітко визначених критеріїв введення-виведення (як ми бачимо з отриманого списку питань, які всі вирішують проблему за допомогою дикого масиву підходів).
Відповіді:
Варіант 1:
NSString *haystack = @"value:hello World:value";
NSString *haystackPrefix = @"value:";
NSString *haystackSuffix = @":value";
NSRange needleRange = NSMakeRange(haystackPrefix.length,
haystack.length - haystackPrefix.length - haystackSuffix.length);
NSString *needle = [haystack substringWithRange:needleRange];
NSLog(@"needle: %@", needle); // -> "hello World"
Варіант 2:
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^value:(.+?):value$" options:0 error:nil];
NSTextCheckingResult *match = [regex firstMatchInString:haystack options:NSAnchoredSearch range:NSMakeRange(0, haystack.length)];
NSRange needleRange = [match rangeAtIndex: 1];
NSString *needle = [haystack substringWithRange:needleRange];
Цей, можливо, трохи перевершений для вашого досить тривіального випадку.
Варіант 3:
NSString *needle = [haystack componentsSeparatedByString:@":"][1];
Цей створює три тимчасові рядки та масив під час розбиття.
Усі фрагменти передбачають, що те, що шукали, насправді міститься в рядку.
Ось проста функція, яка дозволяє робити те, що ви шукаєте:
- (NSString *)getSubstring:(NSString *)value betweenString:(NSString *)separator
{
NSRange firstInstance = [value rangeOfString:separator];
NSRange secondInstance = [[value substringFromIndex:firstInstance.location + firstInstance.length] rangeOfString:separator];
NSRange finalRange = NSMakeRange(firstInstance.location + separator.length, secondInstance.location);
return [value substringWithRange:finalRange];
}
Використання:
NSString *myName = [self getSubstring:@"This is my :name:, woo!!" betweenString:@":"];
getSubstring:…слід викликати, substringInString:…оскільки ви не передаєте йому підрядок, а методи, які починаються з, get…як правило, передаються покажчику буфера для запису. substringFromIndex:створює проміжний підрядок, який непотрібний, ось для чого rangeOfString:options:range:. Нарешті, обертаючи небезпечний фрагмент у нібито загальний метод, ви маскуєте помилку: Якщо роздільник існує один або менше разів у рядку, ви отримаєте виняток із зони дії.
Використовуйте і це
NSString *ChkStr = [MyString substringWithRange:NSMakeRange(5, 26)];
Примітка - Вашим NSMakeRange(start, end)має бути NSMakeRange(start, end- start);
Ось невелика комбінація @Regexident Option 1 та відповідей @Garett, щоб отримати потужний різак рядків між префіксом та суфіксом, на якому є БІЛЬШЕ ... І БІЛЬШЕ слів.
NSString *haystack = @"MOREvalue:hello World:valueANDMORE";
NSString *prefix = @"value:";
NSString *suffix = @":value";
NSRange prefixRange = [haystack rangeOfString:prefix];
NSRange suffixRange = [[haystack substringFromIndex:prefixRange.location+prefixRange.length] rangeOfString:suffix];
NSRange needleRange = NSMakeRange(prefixRange.location+prefix.length, suffixRange.location);
NSString *needle = [haystack substringWithRange:needleRange];
NSLog(@"needle: %@", needle);
<i></i>тегів у своєму проекті, щоб зробити ці рядки курсивом. :)