如何使用带有键和代码值的字典解码NSString中的单词?

时间:2014-11-09 22:31:20

标签: ios cocoa-touch nsstring nsarray nsdictionary

我有使用特殊快捷方式编码的文本报告(即@" 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"。

3 个答案:

答案 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];

您可以在Apple Documentation

查看哪种字符集更适合您的案例

但我会说它应该是标点符号。

答案 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];