正如上一个答案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!"
答案 0 :(得分:1)
您的问题是,您有两个看起来几乎完全相同的变量 - substring
和subString
(请注意不同的大小写)。
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”替换使用“类固醇”并添加缩写点。
然后问题变成:“给定一个单词可能以大写或小写开头,并且可能有标点符号,如何最好地区分标点符号和字母字符,以及如何最好地确定初始字符是否在上部或者小写?“