0

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

4

1 回答 1

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”代理对(例如表情符号)。它可能也适用于其他字符,例如韩文字符,我现在不确定。

ADDED:以下方法使用正则表达式并且应该也可以工作。优点可能是不会创建临时字符串。但是应该衡量哪种方法真的更快。

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);
于 2013-07-13T19:12:14.033 回答