2013-05-21 59 views
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個字符爲「老闆」不再:@"My boss is on boss! Boss boss I do? I boss my boss boss!"

+0

@「我的電腦着火了我該怎麼辦? 「 - 當你發現它時,告訴大家它被着火了。 –

+0

該功能的問題是什麼?提供一個你想要它輸出什麼和實際輸出的例子對我們這些試圖幫助你的人是非常有幫助的。 – lnafziger

+0

對我要輸出的輸出進行編輯。 – user2175433

回答

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? 
+0

這不涉及大寫問題。我已經解決了這個問題。在其他字符串上測試此方法後,它還會將長度超過2位的任何數字轉換爲單詞「boss」。你知道有什麼辦法阻止它這樣做嗎? – user2175433

+1

是的,它處理大小寫 - 這裏:replaceString = [[NSCharacterSet uppercaseLetterCharacterSet] characterIsMember:origChar]? [substring capitalizedString]:subString; 如果它是一個數字,那麼你需要測試第一個字符是否是數字。這不是你原來的問題。如果你有一個非常複雜的問題,它將需要一個複雜的答案!如果你看看NSLogs,你會發現你的原始字符串被改變了! –

+0

對不起,只要你把'[substring capitalizedString]'改成'[subString capitalizedString]''就行了。 – user2175433

-1

如果你正在談論字替換從字內子爲不同替換:我會在空格上標記標記,從而將任何標點符號作爲標記字的一部分。例如「火!」。

如果您想用「類固醇」替換「fire」並保留所有原始大小寫和標點符號,您會注意到「類固醇」以小寫字母開頭並帶有感嘆號,因此您將字母字符串「fire 「加上」類固醇「並追加了這一點。

然後問題就變成了:「給定一個可能以大寫或小寫字母開頭並且可能有標點的單詞,如何最好地區分標點和字母字符,以及如何最好地確定初始字符是否在上還是小寫?「

+1

請注意,如果您希望支持多種語言(例如中文),則在白色空間上進行標記是個壞主意。用他現有的方法打破話語是正確的方法。 – lnafziger

+0

你說的是我正在努力完成的事情,對於這些措辭感到抱歉。鑑於你所說的話,最好的辦法是什麼呢? – user2175433

+0

@Inafziger:中文書寫系統如何定義單詞邊界?我的熟悉程度僅限於西方書寫系統。另外,中文寫作是否具有大寫/小寫的概念? – Tim

1

你的問題是你有兩個看起來幾乎相同的變量 - substringsubString(注意不同的大小寫)。

substring是塊中的當前字,而subString總是@"boss"。當您設置replaceString時,您只能使用subString作爲小寫字詞(用@"boss"替換單詞),而使用substring作爲大寫字詞(基本上用自己替換單詞)。所以結果是你的方法用於用不同的小寫字替換小寫字,但它似乎沒有對大寫字做任何事情。

+0

所以我現在解決了這個問題。我遇到的唯一的其他問題是,當我用其他字符串測試此方法時,它不會忽略字符串中的數字。知道任何方式嗎? – user2175433

相關問題