iOS デバイスのカレンダー エントリを表す EKEvent を指定して、電話番号だけでなく、関連する電話会議のアクセス コードも検出しようとしています。
たとえば、次のようになります。
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;
}
質問: 上記で提案した文字列置換ソリューション以外に、これを行うためのより良い方法はありますか?