我需要为特定的已知语言计算字符串的字长,它有一些字母序列,将其计为1个字母。说“ao”字母是一个字母。我怎样才能做到这一点?
答案 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);