Возвращает результаты NSRegularexpression в виде массива

Я пытаюсь получить строки URL-адреса изображения из некоторого текста, а затем создать массив, содержащий все эти строки URL-адреса изображения. Я думаю, что знаю, как получить URL-адреса изображений с помощью NSRegularExpression, но я просто не знаю, как получить каждый отдельный результат. Я закончил поиск и замену раньше, но это просто включает в себя манипулирование одной гигантской строкой. Вот мой код:

-(NSArray*)parseImages:(NSString*)contents {

    NSArray* imageArray = [[NSArray alloc] init];

    NSError* error = nil;
    NSString* imageHandler = @"\(\?:\\<a\\shref=\"\)https\?:\/\/[\^\/\\s]\+\/\\S\+\\\.\(jpg|png|gif\)";

    NSRegularExpression *imageGrabber = [NSRegularExpression regularExpressionWithPattern:imageHandler options:NSRegularExpressionCaseInsensitive error:&error];
    if (error)
    {
        NSLog(@"Couldn't create regex with given string and options");
        return nil;
    } else {
        //Code to add each individual match to imageArray
    return imageArray;
}

person arc4randall    schedule 17.06.2014    source источник


Ответы (2)


Вот что я использую для нескольких совпадений в регулярном выражении:

NSArray *matchesArray = [self rangesOfString:@"{regex}" inString:aString];
for (NSValue *rangeVal in matchesArray)
{
    NSRange range = [rangeVal rangeValue];
    if (range.location != NSNotFound) {
        // do stuff with the found range - like add to an NSMutableArray!
    }
}

И метод rangesOfString:

- (NSArray *)rangesOfString:(NSString *)searchString inString:(NSString *)str {
    NSMutableArray *results = [NSMutableArray array];
    NSRange searchRange = NSMakeRange(0, [str length]);
    NSRange range;
    while ((range = [str rangeOfString:searchString options:NSRegularExpressionSearch|NSCaseInsensitiveSearch range:searchRange]).location != NSNotFound) {
        [results addObject:[NSValue valueWithRange:range]];
        searchRange = NSMakeRange(NSMaxRange(range), [str length] - NSMaxRange(range));
    }
    return results;
}
person brandonscript    schedule 17.06.2014
comment
разве вы не должны возвращать matchArray вместо себя? - person arc4randall; 18.06.2014
comment
@RDSpinz К сожалению, ошибка копирования. Это вообще не должно было быть возвращением. - person brandonscript; 18.06.2014
comment
На самом деле я использовал это, потому что мне нужно было регулярное выражение, чтобы различать типы изображений! Спасибо! - person arc4randall; 18.06.2014

Пусть Apple сделает тяжелую работу с NSDataDetector

NSString *text = @"jibberish http://link1.com jibberish http://link2.com jibberish";
NSError *error;
NSDataDetector *dd = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:&error];
NSArray *matches = [dd matchesInString:text options:0 range:NSMakeRange(0, text.length)];

NSMutableArray *links = [NSMutableArray new];
for (NSTextCheckingResult *result in matches) {
    [links addObject:[result URL]];
}
NSLog(@"links: %@", links);

Выход NSLog:

ссылки: (
"http://link1.com",
"http://link2.com"
)

Если есть необходимость ограничиться типами расширений:

Добавьте расширения в набор:

NSSet *extensions = [NSSet setWithArray: @[@"jpg", @"png", @"gif"]];

Добавлять только в массив, только если расширение есть в наборе:

NSString *ext = [[url resourceSpecifier] pathExtension];
if ([extensions containsObject:ext]) {
    [links addObject:url];
}
person zaph    schedule 17.06.2014