2011-10-04 16 views
9

Próbuję zastąpić wszystkie znaki oprócz ostatnich 4 w ciągu znaków z *.
W funkcji-c istnieje metoda w klasie NSString replaceStringWithCharactersInRange: withString:, w której chciałbym nadać jej zakres (0,[string length]-4)) z ciągiem @"*". Oto, co robi: 123456789ABCD jest zmodyfikowany do * ABCD, podczas gdy ja chciałbym zrobić ABB ********. Rozumiem, że zastąpił on zakres określony przez obiekt ciągu. Jak to osiągnąć?Zastąp znaki w NSString

Odpowiedz

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

nie działa, ciąg zostaje zastąpiony przez '* – ARC

+0

Try @ "\ d +"' 'regularExpressionWithPattern jako:' argument. Próbowałem '\\ d +' na [tym regex testerze] (http://regexpal.com/), ale to się nie udało, ale '\ d +' działało. –

+0

Naprawiono. Wystarczy zastąpić \\ d + z \\ d we wzorcu. Pamiętaj tylko, że wyrażenia regularne wymagają systemu iOS 4 lub nowszego. Jeśli potrzebujesz go do pracy w systemie iOS 3, powinieneś nam NSScanner – Lefteris

0

Możesz użyć [theString substringToIndex:[theString length]-4], aby uzyskać pierwszą część łańcucha, a następnie połączyć [długośćString] -4 * z drugą częścią. Może ich jest łatwiejszy sposób to zrobić ..

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

działa

+0

Czy rzeczywiście przeczytałeś moje pytanie lub skopiowałeś odpowiedź z mojego pytania?obniżona przeze mnie – ARC

+0

Niestety, nie rozumiem poprawnie tego pytania – Vitaliy

+0

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

1

To wygląda jak prostego problemu ... Get pierwszą część ciąg i powrócić go z ostatnich czterech znaków załączonych do tego.
Oto funkcja, która zwraca ciąg potrzebne:

-(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

Najbardziej nieintuicyjne część w kakao jest tworzenie powtarzalnych gwiazdy bez jakiejś niewygodnej pętli. stringByPaddingToLength:withString:startingAtIndex: pozwala tworzyć powtarzający się ciąg znaków o dowolnej długości chcesz, więc skoro masz, że oto proste rozwiązanie:

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

RegExp nie działa na iOS7, ale być może to pomoże:

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

    NSMutableString *secret = [NSMutableString new]; 

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

    return secret; 
} 

W twoim przypadku powinieneś przestać zastępować 4 ostatnie znaki. Trochę prymitywnie, ale wykonuje pracę

+0

Wszystko to powoduje, że zwraca ciąg znaków, który jest * out. Jak to odpowiada na pytanie? (Pozostawiając ostatnie 4?) –

+0

Hmm rzeczywiście, nie czytał wystarczająco dobrze. dla (int i = 0; i <[długość pasma] - 4; i ++) { [secret appendString: @ "*"]; } następnie użyj nsmakerange, aby skopiować 4 ostatnie znaki. Ale lepsza odpowiedź już tam jest – CocoaChris

0

Nie jestem pewien, dlaczego zaakceptowana odpowiedź została przyjęta, ponieważ działa tylko wtedy, gdy wszystko oprócz ostatniej 4 jest cyfrą. Oto prosty sposób:

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);