1

如上一个答案 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!"

4

3 回答 3

1

您的问题是您有两个看起来几乎相同的不同变量 -substring并且subString(注意不同的大小写)。

substring是块中的当前单词,而subString始终是@"boss". 设置replaceString时,仅subString用于小写单词(将单词替换为@"boss"),但substring用于大写单词(本质上将单词替换为自身)。所以结果是您的方法适用于用不同的小写单词替换小写单词,但它似乎对大写单词没有任何作用。

于 2013-05-22T00:18:28.723 回答
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?
于 2013-05-22T01:17:07.697 回答
-1

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

如果您想将“fire”替换为“steroids”并保留所有原始大小写和标点符号,您会注意到“steroids”以小写开头并带有感叹号,因此您将字母字符串“fire”替换为“steroids” " 并附加标点符号。

那么问题就变成了:“给定一个可能以大写或小写开头并且可能有标点符号的单词,如何最好地区分标点符号和字母字符,以及如何最好地确定初始字符是大写还是小写? "

于 2013-05-21T23:59:38.967 回答