2012-12-31 73 views
0

我正在製作一個iPad應用程序供個人使用,我正在努力在某些字符串中替換一些字符。例如,我得到一個包含「\ t \ t \ t C D」的NSString。現在我想要做的是用C#和D#替換每個C和每個D。我設法做到了這一點,但不幸的是,它對我來說看起來效率不高。替換NSString中的幾個不同的字符

這是到目前爲止我的代碼:

- (IBAction)buttonPressed:(id)sender 
{ 
    if(sender) 
    { 
     NSError *error; 
     NSString *newTab = [[NSString alloc] init]; 
     NSRegularExpression *regexC = [NSRegularExpression regularExpressionWithPattern:@"C" options:0 error:&error]; 
     NSRegularExpression *regexD = [NSRegularExpression regularExpressionWithPattern:@"D" options:0 error:&error]; 

     newTab = [regexC stringByReplacingMatchesInString:self.tab options:0 range:NSMakeRange(0, self.tab.length) withTemplate:@"C#"]; 

     NSString *newTabAfterFirstRegex = [[NSString alloc] initWithString:newTab]; 

     newTabAfterFirstRegex = [regexD stringByReplacingMatchesInString:newTab options:0 range:NSMakeRange(0, newTab.length) withTemplate:@"D#"]; 

     NSLog(@"%@",newTabAfterFirstRegex); 
    } 

}

加上這只是一個小的測試代碼。我真正想做的是有一個算法來檢查給定字符串中所有音樂標籤(CC#DD#EFF#GG#AA#B)的實例,並且當IBAction被觸發時,我希望它們中的每一個被下一個替換(而B變成C)。

任何想法將非常感激!

非常感謝!

回答

0

您可以設置一個正則表達式(例如'[A-G]#?')來匹配某些字符串。使用方法-matchesInString:options:range:,您可以遍歷所有匹配(它將返回每個匹配的範圍),並使用該範圍進行替換。

+0

謝謝Diederik。我會試試看,並回復你! – user1644365

+0

再次嗨!我做了你的建議。我結束了包含幾個元素的數組「 {4,1} { [AG]#?0x0}」, 「 {6,1} { [AG]#?0x0}「 我不確定我是怎麼從範圍中替換一個子串的。我在文檔中看到這兩個元素屬於NSTextCheckingResult類,它們有一個範圍屬性,但我應該如何使用它? – user1644365

+0

我明白{4,1}和{6,1}是需要替換的字符的範圍,但我再也不能得到我應該如何從這些範圍中獲取字符並以某種方式比較它們進行更改。非常感謝你! – user1644365

0

正則表達式似乎有點像矯枉過正對於這一點,你可能只需要做兩所字符串替換,這樣你就不會得到所有從正則表達式的開銷,使用

- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target 
            withString:(NSString *)replacement 

,只是更換了兩次。此外,您不需要執行NSString分配,因爲它會在返回中創建一個引用。

0

我在前幾天創建了以下加密方法。我已經測試過它的目的,它似乎工作。

-(NSString *)ReplaceMe:(NSString *)s { 
// Putting the source into an array 
NSMutableArray *myArray = [[NSMutableArray alloc] init]; 
int i; 
for (i = 0; i < s.length; i++) { 
    [myArray addObject: [self Mid:s :i :1]]; 
} 
// Creating a string with the revised array 
NSMutableString *myString = [NSMutableString new]; 
for (i = 0; i < s.length; i++) { 
    [myString appendString:[self Conversion:[myArray objectAtIndex:i]]]; 
} 
// Final 
return myString; 
} 

上述方法需要兩個附加功能。

-(NSString *)Mid:(NSString *)str:(NSInteger)s:(NSInteger)l { 
if ((s <= str.length-1) && (s + l <= str.length) && (s >= 0) && (l >= 1)) { 
    return [str substringWithRange:NSMakeRange(s, l)]; 
} 
else { 
    return @""; 
} 
} 

另一種是...

-(NSString *)Conversion:(NSString *)s { 
if ([s isEqualToString:@"C"]) { 
    return @"C#"; 
} 
else if ([s isEqualToString:@"D"]) { 
    return @"D#"; 
} 
else { 
    return s; 
} 
} 

你可以把其他的轉換對在功能上面。以下是關於如何使用ReplaceMe的示例。

- (IBAction)clickAction:(id)sender { 
textField2.text = [self ReplaceMe:textField1.text]; 
} 

所以它的ReplaceMe是很容易使用。

+0

嗨,非常感謝你的時間。我測試過,它確實適用於上面的例子,但是如果一個字符串包含「CC#DD#」並且假設你在(NSString *)轉換:(NSString *)s中創建了更多條件,那麼不幸的是它將不能識別C和C#之間的區別。它會把它當作C.也許我可以嘗試在那裏混合一些正則表達式。再次非常感謝你。這是非常有幫助的! – user1644365