2011-10-04 96 views
9

我試圖用*替換字符串中除了最後4個字符以外的所有字符。
在objective-c中有NSString類replaceStringWithCharactersInRange: withString:中的一個方法,我會給它的範圍爲(0,[string length]-4))和字符串@"*"。這就是它的作用:123456789ABCD被修改爲* ABCD,而我正在尋找******** ABCD。 我知道它取代了我用字符串對象指定的範圍。如何做到這一點?替換NSString中的字符

回答

12
NSError *error; 

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\d" options:NSRegularExpressionCaseInsensitive error:&error]; 

NSString *newString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@"*"]; 
+0

不行的,字符串被通過* – ARC

+0

嘗試'代替@ 「\ d +」'爲你的'regularExpressionWithPattern:'說法。我在[這個正則表達式測試程序](http://regexpal.com/)上試過'\\ d +',它失敗了,但'\ d +'工作。 –

+0

修正了它。只需在模式中將\\ d +替換爲\\ d即可。請記住,正則表達式需要iOS 4或更高版本。如果你需要它在iOS 3中工作,你應該NSScanner – Lefteris

0

您可以使用[theString substringToIndex:[theString length]-4]獲取字符串的第一部分,然後將[theString length] -4 *與第二部分組合。也許他們的是更簡單的方式來做到這一點..

-1
NSMutableString * str1 = [[NSMutableString alloc]initWithString:@"1234567890ABCD"]; 
[str1 replaceCharactersInRange:NSMakeRange(0, [str1 length] - 4) withString:@"*"]; 
NSLog(@"%@",str1); 

它的工作原理

+0

您是否真的閱讀過我的問題或從我的問題中複製了答案?downvoted我 – ARC

+0

對不起,我不明白這個問題 – Vitaliy

+0

NSMutableString * str1 = [[NSMutableString alloc] initWithString:@「1234567890ABCD」]; NSRange replacementRange = NSMakeRange(0,[str1 length] - 4); NSMutableString * replacementString = [[NSMutableString alloc] init]; for(uint i = 0; i Vitaliy

1

這看起來像一個簡單的問題...得到的第一個部分字符串,並將追加的最後四個字符歸還到它。
這裏是返回所需的字符串的函數:

-(NSString *)neededStringWithString:(NSString *)aString { 
    // if the string has less than or 4 characters, return nil 
    if([aString length] <= 4) { 
     return nil; 
    } 
    NSUInteger countOfCharToReplace = [aString length] - 4; 
    NSString *firstPart = @"*"; 
    while(--countOfCharToReplace) { 
     firstPart = [firstPart stringByAppendingString:@"*"]; 
    } 
    // range for the last four 
    NSRange lastFourRange = NSMakeRange([aString length] - 4, 4); 
    // return the combined string 
    return [firstPart stringByAppendingString: 
      [aString substringWithRange:lastFourRange]]; 
} 
1

最直觀的部分可可創建重複明星沒有某種尷尬的循環中。 stringByPaddingToLength:withString:startingAtIndex:允許你創建你喜歡的任何長度的重複字符串,因此,一旦您的是,這裏有一個簡單的解決方案:

NSInteger starUpTo = [string length] - 4; 
if (starUpTo > 0) { 
    NSString *stars = [@"" stringByPaddingToLength:starUpTo withString:@"*" startingAtIndex:0]; 
    return [string stringByReplacingCharactersInRange:NSMakeRange(0, starUpTo) withString:stars]; 
} else { 
    return string; 
} 
-1

的正則表達式沒有對iOS7工作,但也許這會有所幫助:

- (NSString *)encryptString:(NSString *)pass { 

    NSMutableString *secret = [NSMutableString new]; 

    for (int i=0; i<[pass length]; i++) { 
     [secret appendString:@"*"]; 
    } 

    return secret; 
} 

在你的情況下,你應該停止替換最後4個字符。位原油,但完成工作

+0

所有這些都會返回一個*'d出來的字符串。這是如何回答這個問題的? (離開最後4?) –

+0

確實,沒有讀得不夠好。 for(int i = 0; i <[pass length] - 4; i ++){secret appendString:@「*」]; } 然後使用nsmakerange複製最後4個字符。但更好的答案已經在那裏 – CocoaChris

0

我不知道爲什麼接受的答案被接受,因爲它只適用於除了最後4以外的所有數字都是數字。這裏有一個簡單的方法:

NSMutableString * str1 = [[NSMutableString alloc]initWithString:@"1234567890ABCD"]; 
NSRange r = NSMakeRange(0, [str1 length] - 4); 
[str1 replaceCharactersInRange:r withString:[[NSString string] stringByPaddingToLength:r.length withString:@"*" startingAtIndex:0]]; 
NSLog(@"%@",str1);