NSRegularExpression заменяет RegExKitLite

Теперь мое приложение нацелено на> iOS4. Я пытаюсь удалить зависимости от платформ, отличных от Apple, где это возможно.

У меня есть этот код в настоящее время

    NSString *destination =@"HHH-DDDD>dddd,ffff";
    NSString *searchString = destination;
    NSString *regexString  = @"[^a-zA-Z\?]";
    NSArray  *splitArray   = NULL;
    splitArray = [searchString componentsSeparatedByRegex:regexString];

Это создает массив со строковыми элементами между всеми символами. то есть «ЧЧЧ», «ДДДД», «дддд», «фффф».

Кажется, в NSRegularExpression вообще нет эквивалента, или я неправильно читаю документацию?


person Lee Armstrong    schedule 19.01.2012    source источник


Ответы (1)


кажется, вы правы, но вы могли бы использовать категорию:

#import "NSString+RegEx_Array.h"

@implementation NSString (RegEx_Array)

- (NSArray*)componentsSeparatedByRegex2:(NSString *)pattern
{
    NSUInteger pos = 0;
    NSRange area = NSMakeRange(0, [self length]);

    NSRegularExpression *regEx = [NSRegularExpression 
                                  regularExpressionWithPattern:pattern 
                                  options:0 error:nil];

    NSArray *matchResults = [regEx matchesInString:self options:0 range:area];

    NSMutableArray *returnArray = [NSMutableArray arrayWithCapacity:matchResults.count];

    for (NSTextCheckingResult *result in matchResults) {
        NSRange substrRange = NSMakeRange(pos, [result range].location-pos);
        [returnArray addObject:[self substringWithRange:substrRange]];
        pos = [result range].location + [result range].length;
    }

    if (pos < area.length) {
        [returnArray addObject:[self substringFromIndex:pos]];
    }

    return returnArray;
}

@end

но я должен признать, что это не так эффективно, как RegexKitLite. Вот вывод для бессмысленного файла:

2012-02-08 00:16:32.251 shittyagain[96057:c03] String-Length: 36355200
2012-02-08 00:16:36.420 shittyagain[96057:c03] Time taken RegexKitLite: 4.167
2012-02-08 00:16:42.989 shittyagain[96057:c03] Time taken NSRegularExp: 6.568

и код тестирования:

NSString *regx = @"[^a-zA-Z\?]";
NSString *file = [[NSBundle mainBundle]pathForResource:@"reallylong" ofType:nil];
NSString *searchString = [NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil];

NSLog(@"String-Length: %ld", searchString.length);

NSDate *preDate = [NSDate date];
[searchString componentsSeparatedByRegex:regx];
NSLog(@"Time taken RegexKitLite: %1.3f", [preDate timeIntervalSinceNow]*-1);

NSDate *preDate2 = [NSDate date];
[searchString componentsSeparatedByRegex2:regx];
NSLog(@"Time taken NSRegularExp: %1.3f", [preDate2 timeIntervalSinceNow]*-1);

Я не уверен, действительно ли разница имеет значение, потому что файл имеет размер ~ 36 МБ, но на тот случай, если кому-то это нужно очень быстро, он должен использовать RegexKitLite. Я хотел бы, чтобы кто-нибудь мог опубликовать реальный тест производительности и/или методы NSRegularExpression по умолчанию. Я хочу знать, кто из них быстрее =)

person Community    schedule 07.02.2012