如何在保持正确大写的同时用其他单词替换句子中的某些单词?

时间:2013-05-21 23:47:42

标签: objective-c nsstring

正如上一个答案https://stackoverflow.com/a/16458627/1633251中所详述的那样,enumerateSubstringsInRange:似乎比将字符串分成数组要快得多,其中有一些猜测是标点字符。但是,我不明白的是我如何有效地保持正确的大小写和标点符号(但忽略单词中的标点符号,即撇号)。注意我对Objective-C很新。

具体来说,我有这个字符串:@"My computer is on fire! What should I do? I need my computer's files!"我希望将超过5个字符的每个单词更改为“boss”,同时保留大写:@"My boss is on boss! Boss boss I do? I boss my boss boss!"

3 个答案:

答案 0 :(得分:1)

您的问题是,您有两个看起来几乎完全相同的变量 - substringsubString(请注意不同的大小写)。

substring是块中的当前单词,而subString始终为@"boss"。设置replaceString后,您只能使用subString表示小写单词(将单词替换为@"boss"),而substring表示大写单词(基本上用自己替换单词)。因此,结果是您的方法适用于使用不同的小写单词替换小写单词,但它似乎对大写单词没有任何作用。

答案 1 :(得分:1)

以下代码将执行您想要的操作,并更新以处理数字:

NSString *original = @"My computer is on fire at 9:00 AM! What should I do?";
NSString *swapString = @"boss";

NSMutableString *modified = [NSMutableString stringWithCapacity:[original length]];
__block NSUInteger lastCharOffset = 0;

[original enumerateSubstringsInRange:NSMakeRange(0, [original length]) options:NSStringEnumerationByWords // NSStringEnumerationByComposedCharacterSequences // | NSStringEnumerationSubstringNotRequired
    usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop)
        {
            //NSLog(@"SUBSTRING %@", substring);

            NSString *replaceString = substring;
            if([substring length] > 2) {
                unichar origChar = [substring characterAtIndex:0];
                if(![[NSCharacterSet decimalDigitCharacterSet] characterIsMember:origChar]) {
                    replaceString = [[NSCharacterSet uppercaseLetterCharacterSet] characterIsMember:origChar] ? [swapString capitalizedString] : swapString;
                }
            }
            if(substringRange.location) {
                [modified appendString:[original substringWithRange:NSMakeRange(lastCharOffset, substringRange.location-lastCharOffset)]];
            }
            [modified appendString:replaceString];
            lastCharOffset = substringRange.location + substringRange.length;
        } ];
        // Grab any trailing punctuation
        [modified appendString:[original substringWithRange:NSMakeRange(lastCharOffset, [original length] - lastCharOffset)]];
    NSLog(@"Orig: %@", original);
    NSLog(@"Modi: %@", modified);

输出结果为:

Orig: My computer is on fire at 9:00 AM! What should I do?
Modi: My boss is on boss at 9:00 AM! Boss boss I do?

答案 2 :(得分:-1)

如果你所说的单词替换与单词内子串替换不同:我会在白空间上进行标记,从而将任何标点符号作为标记化单词的一部分。例如“火!”。

如果你想用“类固醇”取代“火”并保留所有原始大写和标点符号,你会注意到“类固醇”以小写字母开头并有一个惊叹号,所以你用字母串“fire”替换使用“类固醇”并添加缩写点。

然后问题变成:“给定一个单词可能以大写或小写开头,并且可能有标点符号,如何最好地区分标点符号和字母字符,以及如何最好地确定初始字符是否在上部或者小写?“