NSString类别计算长度组合一些字符

时间:2013-07-13 18:54:46

标签: objective-c

我需要为特定的已知语言计算字符串的字长,它有一些字母序列,将其计为1个字母。说“ao”字母是一个字母。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

一个想法是用单个字符替换每个字母序列的出现 计算结果的长度:

NSString *string = @"Hello world";
NSMutableString *tmp = [string mutableCopy];
NSArray *sequences = @[@"ll", @"wo"];
for (NSString *seq in sequences) {
    [tmp replaceOccurrencesOfString:seq
                         withString:@"."
                            options:NSCaseInsensitiveSearch
                              range:NSMakeRange(0, [tmp length])];
}
// tmp is "He.o .rld" now
NSUInteger length = [tmp length];

备注: length不计算"组成字符"作为一个单一的角色。 如果这是一个问题,您必须使用enumerateSubstringsInRange:options:usingBlock: 使用NSStringEnumerationByComposedCharacterSequences选项来计算 字符正确。这适用于所有" UTF-16"代理对(例如Emojis)。它也可能适用于韩文字符等其他字符, 我现在不确定。

已添加:以下方法使用正则表达式,也应该可以正常工作。 优点可能是没有创建临时字符串。但是应该 衡量哪种方法真的更快。

NSString *string = @"Hello world";

NSString *pattern = @"ll|wo|.";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:NULL];
NSUInteger length = [regex numberOfMatchesInString:string
                                           options:0
                                             range:NSMakeRange(0, [string length])];


NSLog(@"length = %d", length);