Заменить символы в NSString - PullRequest
       2

Заменить символы в NSString

10 голосов
/ 04 октября 2011

Я пытаюсь заменить все символы, кроме последних 4 в строке, на *.
В target-c есть метод в классе NSString replaceStringWithCharactersInRange: withString:, где я бы дал ему диапазон (0,[string length]-4)) со строкой @"*". Вот что он делает: 123456789ABCD изменен на * ABCD, в то время как я пытаюсь сделать ******** ABCD. Я понимаю, что он заменил диапазон, указанный мной, строковым объектом. Как это сделать?

Ответы [ 7 ]

12 голосов
/ 04 октября 2011
NSError *error;

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

NSString *newString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@"*"];
1 голос
/ 05 октября 2011

Самая неинтуитивная часть в Какао - создание повторяющихся звезд без каких-либо неловких циклов. 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 голос
/ 04 октября 2011

Это выглядит как простая проблема ... получить первую строку детали и вернуть ее с последними четырьмя символами, добавленными к ней.
Вот функция, которая возвращает необходимую строку:

-(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]];
}
0 голосов
/ 06 февраля 2016

Я не уверен, почему принятый ответ был принят, поскольку он работает, только если все, кроме последних 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);
0 голосов
/ 21 ноября 2013

Регулярное выражение не работает на iOS7, но, возможно, это поможет:

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

    NSMutableString *secret = [NSMutableString new];

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

    return secret;
}

В вашем случае вам следует прекратить замену последних 4 символов. Немного грубовато, но выполняет свою работу

0 голосов
/ 04 октября 2011
NSMutableString * str1 = [[NSMutableString alloc]initWithString:@"1234567890ABCD"];
[str1 replaceCharactersInRange:NSMakeRange(0, [str1 length] - 4) withString:@"*"];
NSLog(@"%@",str1);

это работает

0 голосов
/ 04 октября 2011

Вы можете использовать [theString substringToIndex:[theString length]-4], чтобы получить первую часть строки, а затем объединить [theString length] -4 * со второй частью.Возможно, это более простой способ сделать это ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...