Определите часть кода доступа телефонного номера конференц-связи в строке NSString.

Учитывая EKEvent, представляющий запись календаря на устройстве iOS, я пытаюсь определить не только номер телефона, но и соответствующий код доступа к конференц-связи.

Например, учитывая:

NSString *text = @"Blah Blah Blah (555) 123-4567 Access Code: 9876# Blah Blah Blah";

Я хотел бы реализовать метод, который будет возвращать это значение:

@"555-123-4567,,9876#"

Записи календаря могут использовать различный текст, кроме @"Access Code: " описать номер, используемый для доступа к конференц-связи. Например, другие строки могут включать @"passcode: ", @"virtual room number: ", так далее.

Мне известно о способности NSDataDetector определять номер телефона, но, учитывая приведенную выше строку примера, возвращается @"555-123-4567 Access Code: 9876#" (обратите внимание, что здесь "Код доступа" все еще является подстрокой).

Я думаю о том, чтобы просто взять значение, возвращенное из NSDataDetector, и выполнить замену строки для @"Access Code: " и аналогичные подстроки, которые могут появиться в записи календаря, заменяя на @",,", но это не кажется достаточно элегантным. Я бы предпочел, чтобы NSDataDetector сделал это для меня.

Вот мой код, которым я не очень доволен:

- (NSArray *) phonesFromText:(NSString *)text {
    NSMutableArray *phones = [NSMutableArray array];

    if (text) {
        NSError *error = nil;
        NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber
                                                                   error:&error];

        [detector enumerateMatchesInString:text
                                   options:kNilOptions
                                     range:NSMakeRange(0, [text length])
                                usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
                                    NSString *phoneNumberWithText = result.phoneNumber;

                                    // Replace "access code:" with ",," so that it can be dialed by the built-in phone app
                                    NSString *phoneNumberWithoutText = [phoneNumberWithText stringByReplacingOccurrencesOfString:@"access code:"
                                                                                                                      withString:@",,"
                                                                                                                         options:NSCaseInsensitiveSearch
                                                                                                                           range:NSMakeRange(0, [phoneNumberWithText length])];

                                    // Remove any unwanted characters that may still be lingering after the above string replacement
                                    NSCharacterSet * toRemove = [[NSCharacterSet characterSetWithCharactersInString:@"+,#-0123456789"] invertedSet];
                                    phoneNumberWithoutText = [[phoneNumberWithoutText componentsSeparatedByCharactersInSet:toRemove] componentsJoinedByString:@""];                                        

                                    [phones addObject:phoneNumberWithoutText];
                                }];

    }

    return phones;
}

Вопрос: Кроме решения для замены строк, которое я предложил выше, есть ли лучший способ сделать это?

0 ответов

Другие вопросы по тегам