我有使用特殊快捷方式编码的文本报告(即@" BLU"对于@" BLUE",@" ABV"对于@"上面"等等。
我创建了一个NSDictionary,其中键是编码词,值是翻译。
目前我使用以下代码翻译字符串:
NSMutableString *decodedDesc = [@"" mutableCopy];
for (NSString *word in [self.rawDescriprion componentsSeparatedByString:@" "]) {
NSString * decodedWord;
if (word && word.length>0 && [word characterAtIndex:word.length-1] == '.') {
decodedWord = [abbreviations[[word substringToIndex:word.length-1]] stringByAppendingString:@"."];
} else
decodedWord = abbreviations[word];
if (!decodedWord)
decodedWord = word;
[decodedDesc appendString:[NSString stringWithFormat:@"%@ ",decodedWord]];
}
_decodedDescription = [decodedDesc copy];
问题在于报告中的单词并不总是由空格分隔。有时它会连接到其他特殊字符,例如@" - "或@" /",代码忽略了这个词,因为像@" BLU-ABV"不在字典中。
我如何改进此代码以在翻译单词时忽略特殊字符但在翻译的NSString中保留它们?例如@" BLU-ABV"会翻译成@" Blue-Above"。
答案 0 :(得分:0)
这可以通过
完成NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@" -/"];
[self.rawDescription componentsSeparatedByCharactersInSet:characterSet];
其中characterSet包含您要分隔的字符,或者您甚至可以使用显示单词的字母(仅字母或字母数字)定义CharacterSet,然后使用invertedSet
。
答案 1 :(得分:0)
使用字符集将其分开。
NSMutableCharacterSet* cSet = [NSMutableCharacterSet punctuationCharacterSet];
// add your own custom character
[cSet addCharactersInString:@" "];
NSArray *comps = [self.rawDescriprion componentsSeparatedByString:cSet];
查看哪种字符集更适合您的案例
但我会说它应该是标点符号。
答案 2 :(得分:0)
我解决了。解决方案是逐个枚举原始的NSString。每个字母都添加到一个单词中,直到达到特殊字符。
在到达特殊字符时,翻译后的单词,后跟特殊字符,将被转储到已翻译的报表(这是一个NSMutableString)中,并且单词变量将重置为@“”。
以下是代码:(不包括字典或原始NSString初始化)
__block NSString *word;
NSCharacterSet *specialChars = [[NSCharacterSet alphanumericCharacterSet] invertedSet];
[_rawDescriprion enumerateSubstringsInRange:NSMakeRange(0, [_rawDescriprion length])
options:(NSStringEnumerationByComposedCharacterSequences)
usingBlock:^(NSString *letter, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
if (!word)
word = @"";
//if letter is a special char
if ([letter rangeOfCharacterFromSet:specialChars].location != NSNotFound) {
//add old word to decoded string
if (word && abbreviations[word])
[decodedDesc appendString:abbreviations[word]];
else if (word)
[decodedDesc appendString:word];
//Add the punctuation character to the decoded description
[decodedDesc appendString:letter];
//Clear word variable
word = @"";
}
else { //Alpha-numeric letter
//add letter to word
word = [word stringByAppendingString:letter];
}
}];
//add the last word to the decoded string
if (word && abbreviations[word])
[decodedDesc appendString:abbreviations[word]];
else if (word)
[decodedDesc appendString:word];
_decodedDescription = [decodedDesc copy];