Як отримати підрядок NSString?


78

Якщо я хочу отримати значення з NSString @"value:hello World:value", що я повинен використовувати?

Повернене значення, яке я хочу, це @"hello World".



Я голосую, щоб закрити це питання, оскільки незрозуміло, що ви задаєте. Тут взагалі немає вказівок на те, що саме потрібно. Ви хочете просто повернутися "hello World"? return @"hello World". Ви хочете повернути лише те, що між двокрапками? Ви хочете зачистити все ліве від самої лівої товстої кишки і все право від самої правої товстої кишки? Для цього питання немає чітко визначених критеріїв введення-виведення (як ми бачимо з отриманого списку питань, які всі вирішують проблему за допомогою дикого масиву підходів).
nhgrif

Відповіді:


158

Варіант 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];

Цей створює три тимчасові рядки та масив під час розбиття.


Усі фрагменти передбачають, що те, що шукали, насправді міститься в рядку.


Він плакав на NSAnchoredSearch ... можливо, NSMatchingAnchored краще.
Jonny

74

Ось трохи менш складна відповідь:

NSString *myString = @"abcdefg";
NSString *mySmallerString = [myString substringToIndex:4];

Див. Також substringWithRange і substringFromIndex


1
На жаль, це не відповідає на запитання (як отримати підрядок із середини рядка).
Monolo

що це повертається
Чиковіц

17

Ось проста функція, яка дозволяє робити те, що ви шукаєте:

- (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:@":"];

1
Якщо це висвітлює, я можу сказати вам, чому я проголосував за іншу відповідь. Я волів би написати два рядки коду, ніж шість.
Le Mot Juiced

2
Проблема в тому, що ці два рядки коду вирішують лише конкретний випадок, який ніколи не буде існувати ні для кого - мабуть, навіть не для того, хто його запитував.
Garett

getSubstring:…слід викликати, substringInString:…оскільки ви не передаєте йому підрядок, а методи, які починаються з, get…як правило, передаються покажчику буфера для запису. substringFromIndex:створює проміжний підрядок, який непотрібний, ось для чого rangeOfString:options:range:. Нарешті, обертаючи небезпечний фрагмент у нібито загальний метод, ви маскуєте помилку: Якщо роздільник існує один або менше разів у рядку, ви отримаєте виняток із зони дії.
Регексидент

14

Використовуйте і це

NSString *ChkStr = [MyString substringWithRange:NSMakeRange(5, 26)];

Примітка - Вашим NSMakeRange(start, end)має бути NSMakeRange(start, end- start);


12

Ось невелика комбінація @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);

Тепер це працює! Я спробував варіант 1 Regixident, у мене він не спрацював. Я не можу подумати чому. Я шукав рішення отримати рядок всередині <i></i>тегів у своєму проекті, щоб зробити ці рядки курсивом. :)
Гленн Посадас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.